awk를 사용하여 여러 줄 일치 및 교체를 수행하는 방법은 무엇입니까?

awk를 사용하여 여러 줄 일치 및 교체를 수행하는 방법은 무엇입니까?

텍스트 파일에서 각 줄 끝의 후행 공백을 무시하고 줄이 숫자로 끝나지 않으면 해당 줄과 다음 줄 사이에 줄 바꿈이 있다고 가정하고 이러한 줄 바꿈을 찾고 싶습니다. 그런 다음 이를 한 줄로 연결합니다. 예를 들어

line 1
li
ne 2

두 번째 줄과 세 번째 줄 사이에 개행 문자가 있습니다. 파일을 다음과 같이 수정해야 합니다.

line 1
line 2

이러한 개행 문자를 찾으려면 여러 줄 일치를 수행해야 합니다. 레코드 구분 기호를 변경하여 이 작업을 수행했지만 다음은 작동하지 않습니다.

$ awk 'BEGIN{RS="";}; { if (match($0, /[^[:digit:] ] *\n/)) print $0;} ' inputfile

줄 바꿈으로 구분된 두 줄을 연결하려면 여전히 궁금합니다.

감사해요.

답변1

나는 다른 방법으로 문제를 해결할 것입니다: "줄 끝 조건"이 발견될 때까지 입력을 반복하여:

awk '{ 
       line=$0; 
       while($0 !~ /[[:digit:]] *$/ && getline > 0) { 
         line=line$0; 
       }
       print line
     }' < input

확장 입력 파일에서:

line 1
li
ne 2
li
ne 
number 3
line 4

또는 더 자세히 설명하면 다음과 같습니다(후행 공백 확인).

$ cat -e input
line 1$
li$
ne 2$
li$
ne $
number 3$
line 4$

출력은 다음과 같습니다

line 1
line 2
line number 3
line 4

답변2

다음과 같이 뭔가를 실행할 수 있습니다

awk 'BEGIN{RS=SUBSEP; ORS="" } {print gensub(/([^0-9])\n/,"\\1","g",$0)}' ex
  • RS=SUBSEP레지스터 구분 기호를 텍스트 파일에 나타나지 않는 값으로 설정합니다(입력 파일을 로 설정 $0).
  • 그렇다면 당신이 가장 좋아하는 여러 줄 변환은 무엇입니까?

답변3

$ cat file
line 1
li
ne 2
lo
ng li
ne 3
$ awk 'line ~ /[0-9]$/ { print line; line = "" } { line = line $0 } END { print line }' file
line 1
line 2
long line 3

이는 변수에 "출력 라인"을 누적하여 line변수가 숫자로 끝날 때마다 이를 인쇄하고 재설정합니다. 또한 마지막 줄(완료 여부에 관계없이)을 출력하기 위해 끝에 인쇄합니다.

대략 sed동일합니다(그러나 명시적인 루프 포함).

$ sed -e ':again' -e '/[0-9]$/{ p; d; }; N; s/\n//' -e 'tagain' file
line 1
line 2
long line 3

답변4

작은 GNU sed?

sed ':L; /[0-9] *$/!{N; bL;}; s/\n//g' file

관련 정보