이 줄이 있어요
word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5
숫자 필드 앞이나 숫자 필드 뒤의 영숫자 필드 앞에 개행 문자가 삽입되도록 이 줄을 분할하고 싶습니다. 그러면 출력은 다음과 같습니다.
word1 word2
1234
4567
word3
8901
word4 word5
2541
5142
word5
모든 영숫자 필드는 문자로 시작됩니다.
답변1
영숫자 단어 사이의 공백을 유지하고 다른 모든 단어를 개행 문자로 변환하려는 것처럼 들립니다.
perl -pe 's{([^\d\s]\S*\s+)(?=\S*[^\d\s])|\s+}{$1//"\n"}ge'
답변2
echo "word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5" |perl -pe 's/(\s)([0-9]+)/$1\n$2/g; s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g;'
설명하다:
perl -pe
:각 입력 줄에 대해 다음 Perl 스크립트를 실행하고 결과를 인쇄합니다.s/(\s)([0-9]+)/$1\n$2/g
: 공백 + 숫자 필드 -> 공백 +새로운 팀+ 숫자 필드s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g
: 공백 + 숫자 필드 + 공백 + 영숫자 필드 -> 공백 + 숫자 필드 +새로운 팀+ 영숫자 필드- 각 교체가 끝나면
g
"글로벌"을 의미합니다. 전체 라인에 대해 이 작업을 수행합니다.
답변3
awk 스크립트에 다음 코드를 입력하세요. 스크립트가 호출되었다고 가정합니다. do_magic.awk
#!/usr/bin/awk -f
{
str=$1
for (i=2;i<=NF;++i)
if ($i ~ /^[0-9]+/) str = str "\n" $i "\n"
else str = str " " $i
gsub(/\n[[:space:]]*/,"\n",str)
print str
}
호출 스크립트 사용
do_magic.awk yourfile
결과 :
word1 word2
1234
4567
word3
8901
word4 word5
2541
5142
word5
추신: 효과적인 해결책을 찾았습니다. geirha
전체 답변은 freenode #awk 에서 확인할 수 있습니다. 그래서 모든 공로가 그에게 돌아갑니다!