나는 보통 LaTeX로 컴파일하거나 다른 형식으로 작성하고 개행 문자는 무시되기 때문에 문장당 한 줄을 쓰는 데 익숙합니다. 나는 새 문단의 시작을 나타내기 위해 빈 줄을 사용한다.
이제 이 스타일로 작성된 파일이 있는데 이를 일반 텍스트로 보내고 싶습니다. 모든 단일 줄 바꿈을 제거하고 이중 줄 바꿈은 그대로 유지하고 싶습니다. 이것이 내가 한 일입니다:
sed 's/^$/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
이것은 빈 줄을 파일에 없을 것이라고 확신하는 일부 텍스트로 대체합니다. NEWLINE
그런 다음 모든 줄 바꿈을 제거하고 awk
(일부 웹 사이트에서 이 트릭을 찾았습니다) NEWLINE
s를 필요한 두 개 줄 바꿈으로 바꿉니다.
이것은 매우 간단한 일을 수행하는 데는 오랜 시간이 걸리는 것처럼 보입니다. 더 쉬운 방법이 있나요? 그리고 여러 개의 공백(어떤 이유에서인지 가끔 나타나는 경우도 있음)을 하나의 공백으로 대체할 수 있는 방법도 있으면 좋을 것 같습니다.
저는 emacs를 사용하므로 emacs 관련 트릭이 있으면 좋을 것 같지만 순수 버전 sed
이나 순수 awk
버전을 선호합니다.
답변1
다음과 같이 awk를 사용할 수 있습니다.
$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } ' test
또는 끝에 추가 개행 문자가 필요한 경우:
$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } END { print ""; } ' test
또는 개행 문자로 단락을 구분하려는 경우:
$ awk ' /^$/ { print "\n"; } /./ { printf("%s ", $0); } END { print ""; } ' test
이러한 awk 명령은 모드로 보호되는 작업을 활용합니다.
/regex/
또는
END
다음 작업은 패턴이 현재 줄과 일치하는 경우에만 수행됩니다.
그리고 이러한 문자는 줄의 시작, 끝 및 모든 문자가 일치하는 ^$.
정규식에서 특별한 의미를 갖습니다 .^
$
.
답변2
awk 또는 Perl을 사용하세요.단락 모드빈 줄로 섹션을 구분하여 파일 섹션을 섹션별로 처리합니다.
awk -vRS= '
NR!=1 {print ""} # print blank line before every record but the first
{ # do this for every record (i.e. paragraph):
gsub(" *\n *"," "); # replace newlines by spaces, compressing spaces
sub(" *$",""); # remove spaces at the end of the paragraph
print
}
'
perl -000 -pe ' # for every paragraph:
print "\n" unless $.==1; # print a blank line, except before the first paragraph
s/ *\n *(?!$)/ /g; # replace newlines by spaces, compressing spaces, but not at the end of the paragraph
s/ *\n+\z/\n/ # normalize the last line end of the paragraph
'
물론 이것은 (La)TeX를 구문 분석하지 않기 때문에 주석, 축어적 환경 및 기타 특수 구문에 큰 혼란을 가져올 것입니다. 당신은 알고 싶을 수도 있습니다디텍스또는 기타 (La)TeX를 텍스트로 변환하는 변환기.
답변3
(이전 질문 되살리기)
이것은 정확히 무엇이며 fmt
단락 par
형식 재지정을 위한 것 같습니다. 여러분과 마찬가지로(그리고 많은 프로그램처럼) 단락 경계를 하나 이상의 빈 줄로 정의합니다. 다음 중 하나를 통해 텍스트를 파이핑해 보세요.
fmt
GNU Coreutils에 있는 표준 유닉스 유틸리티입니다.
par
fmt
Adam M. Costello가 작성한 크게 향상된 버전이며 다음 위치에서 찾을 수 있습니다.http://www.nicemice.net/par/(또한 데비안을 포함한 여러 배포판용으로 패키지되었습니다. 비록 지금은 새로운 pkg 관리자가 있지만 저는 1996년 1월에 데비안용으로 패키지했습니다.)
답변4
내가 올바르게 이해했다면 빈 줄은 두 개의 연속 개행을 의미합니다 \n\n
.
그렇다면 가능한 해결책 중 하나는 개별적으로 발생하는 개행 문자를 모두 제거하는 것입니다.
Perl에서 예측 어설션은 이를 수행하는 한 가지 방법입니다.
$ perl -0777 -i -pe 's/\n(?=[^\n])//g' test
- 이
-0777
플래그는 전체 파일을 단일 문자열로 효과적으로 병합합니다. -p
Perl이 처리 중인 문자열을 기본적으로 인쇄하도록 지시합니다.-i
내부 편집 지정- 전역 일치는 모든 단일 개행 항목이 처리되도록 보장합니다.