나는 일반적으로 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 또는 pure awk 버전을 보게 될 것이다.
답변
다음과 같이 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
다음 조치는 패턴이 현재 행과 일치하는 경우에만 실행됩니다.
그리고 ^$.
문자는 정규식에서 특별한 의미를 가지며, 여기서 ^
줄의 시작, $
끝 및 .
임의의 문자 와 일치합니다 .
답변
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를 구문 분석하지 않기 때문에 주석, 말 그대로 환경 및 기타 특수 구문을 끔찍하게 손상시킵니다. DeTeX 또는 다른 (La) TeX- 텍스트 변환기 를 살펴볼 수 있습니다 .
답변
sed 솔루션
$ sed -e ':a;N;$!ba;s/\(.\)\n/\1 /g' -e 's/\n/\n\n/' test.text
이 솔루션 :a
에서는 레이블을 작성하고 a
명령을 사용하지 않습니다 .
여러 공간 교체
사용 tr
:$ tr -s ' ' <test.text
답변
내가 올바르게 이해했다면 빈 줄은 두 개의 연속적인 줄 바꿈을 의미 \n\n
합니다.
그렇다면 가능한 한 가지 해결책은 줄 바꿈의 모든 단수 발생을 제거하는 것입니다.
Perl에서 미리보기 어설 션은이를 달성하는 한 가지 방법입니다.
$ perl -0777 -i -pe 's/\n(?=[^\n])//g' test
-0777
플래그 효과적으로 하나의 문자열로 전체 파일을 slurps-p
펄에게 기본적으로 작업중 인 문자열을 인쇄하도록 지시합니다.-i
전체 편집을 지정합니다- 전역 일치는 모든 단일 줄 바꿈 발생을 처리합니다.
답변
(고대 질문의 부활)
이것은 정확히 것 같다 fmt
및 par
단락 재 포맷 -에 대한 것입니다. 당신처럼 (그리고 많은 프로그램처럼) 그들은 단락 경계를 하나 이상의 빈 줄로 정의합니다. 이 중 하나를 통해 텍스트를 파이핑 해보십시오.
fmt
표준 유닉스 유틸리티이며 GNU Coreutils에서 찾을 수 있습니다.
par
fmt
Adam M. Costello가 작성 하여 크게 개선 한 것으로 http://www.nicemice.net/par/ 에서 찾을 수 있습니다 (데비안을 포함한 여러 배포판에도 패키지되어 있음-1996 년 1 월 데비안 용 패키지, pkg에 대한 새로운 관리자가 있지만).
답변
sed -e'/./{H;$!d;}' -e'x;s/\n//g'
sed
H
하나 이상의 문자를 포함하는 모든 행을 이전 공간에 추가합니다 . 그것은 바로 d
그 곳을 제외하고는 모두 마지막 순간을 제외한 모든 사람들을 끌어들입니다. 남아있을 수있는 유일한 행은 공백이며, sed
e x
가 보류 및 패턴 공간을 변경하고 누적 된 모든 \n
ewline 문자를 삭제할 때이 행에 있습니다.
<tabs> 또는 <spaces> 만 포함 된 행을 공백 으로 간주하려면 /./
위 의 주소를로 바꾸십시오 /[^[:blank:]]/
. 공간을 쥐어 짜려면 다음을 수행하십시오.
sed -e'/./{H;$!d;}' \
-e'x;s/\n//g' \
-e's/\([[:blank:]]\)*/\1/g'
답변
Gilles의 perl과 awk 간결한 예제를 본 후, 나는 이것을 게시하는 것을 꺼려했지만 이미 연습을 마쳤으며 기능적인 스크립트이며 합리적으로 문서화되어 있습니다. 이 점만으로도 일부 사람들이 관심을 가질 수 있습니다.
이 스크립트는 공백이 포함되어 있어도 빈 줄을 공백으로 간주합니다.
텍스트의 여러 공백이 단일 공백으로 압축됩니다.
텍스트 행에서 후행 공백이 제거됩니다. 연속적인 빈 줄은 한 줄로 축소됩니다. 스크립트는 맨 위와 맨 아래의 빈 줄을 그대로 둡니다.
가장 사소한 스크립트 이외의 다른 경우에는 sed를 별도의 스크립트 파일로 구조화 된 형태로 훨씬 쉽게 작성할 수 있습니다. 다음은 그러한 예입니다.
확장 정규식 구문
호출 사용 : $ sed -rf script text-file
:first-empty-line
#================
/^[[:space:]]*$/ { # if pattern-space is empty...
$q # last line # flush-quit
n # pattern-flush=nextline-continue
:subsequent-empty-line
#=====================
/^[[:space:]]*$/ { # if pattern-space is empty...
$d # last line # pattern-delete-cycle
N # pattern+=nl+nextline
s/.*\n// # scrap the leading 'blank' line
t subsequent-empty-line # branch-on-substitute
}
}
:text-line
#=========
$q # last line # flush-quit
s/^(.*)[[:space:]]*/\1/ # trim trailing whitespace
s/ +/ /g # condense mulltiple spaces
N # pattern+=nl+nextline
/^.*\n[[:space:]]*$/ { # if newly-read line is blank
P # pattern-first-line-print
s/^.*\n// # remove the leading 'text' line
t first-empty-line # branch-on-substitute
}
# read line is text
s/\n/ / # replace \n with a space
t text-line # branch-on-substitute
참고 : flush
주석에서 의미 : 패턴 공간을 sed의 내부 stdout 처리로 보냅니다. stdout에 대한 명확한 인쇄를 의미하지는 않습니다. 출력은 sed의 -n
옵션 에 따라 다릅니다 . 예. q
명령 수단의 높이를 종료하지 않고 두 조각을 비교 … : echo x |sed -e q
인쇄 X, echo x |sed -ne q
인쇄 아무것도의 사용 반면 p
에 따라 두 번 또는 한 번에 ‘X’를 인쇄 할 명령을 -n
옵션.