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