단일 개행 문자만 바꾸는 더 좋은 방법이 있어야 합니까?

단일 개행 문자만 바꾸는 더 좋은 방법이 있어야 합니까?

나는 보통 LaTeX로 컴파일하거나 다른 형식으로 작성하고 개행 문자는 무시되기 때문에 문장당 한 줄을 쓰는 데 익숙합니다. 나는 새 문단의 시작을 나타내기 위해 빈 줄을 사용한다.

이제 이 스타일로 작성된 파일이 있는데 이를 일반 텍스트로 보내고 싶습니다. 모든 단일 줄 바꿈을 제거하고 이중 줄 바꿈은 그대로 유지하고 싶습니다. 이것이 내가 한 일입니다:

sed 's/^$/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt

이것은 빈 줄을 파일에 없을 것이라고 확신하는 일부 텍스트로 대체합니다. NEWLINE그런 다음 모든 줄 바꿈을 제거하고 awk(일부 웹 사이트에서 이 트릭을 찾았습니다) NEWLINEs를 필요한 두 개 줄 바꿈으로 바꿉니다.

이것은 매우 간단한 일을 수행하는 데는 오랜 시간이 걸리는 것처럼 보입니다. 더 쉬운 방법이 있나요? 그리고 여러 개의 공백(어떤 이유에서인지 가끔 나타나는 경우도 있음)을 하나의 공백으로 대체할 수 있는 방법도 있으면 좋을 것 같습니다.

저는 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형식 재지정을 위한 것 같습니다. 여러분과 마찬가지로(그리고 많은 프로그램처럼) 단락 경계를 하나 이상의 빈 줄로 정의합니다. 다음 중 하나를 통해 텍스트를 파이핑해 보세요.

fmtGNU Coreutils에 있는 표준 유닉스 유틸리티입니다.

parfmtAdam M. Costello가 작성한 크게 향상된 버전이며 다음 위치에서 찾을 수 있습니다.http://www.nicemice.net/par/(또한 데비안을 포함한 여러 배포판용으로 패키지되었습니다. 비록 지금은 새로운 pkg 관리자가 있지만 저는 1996년 1월에 데비안용으로 패키지했습니다.)

답변4

내가 올바르게 이해했다면 빈 줄은 두 개의 연속 개행을 의미합니다 \n\n.

그렇다면 가능한 해결책 중 하나는 개별적으로 발생하는 개행 문자를 모두 제거하는 것입니다.

Perl에서 예측 어설션은 이를 수행하는 한 가지 방법입니다.

$ perl -0777 -i -pe 's/\n(?=[^\n])//g' test
  • -0777플래그는 전체 파일을 단일 문자열로 효과적으로 병합합니다.
  • -pPerl이 처리 중인 문자열을 기본적으로 인쇄하도록 지시합니다.
  • -i내부 편집 지정
  • 전역 일치는 모든 단일 개행 항목이 처리되도록 보장합니다.

관련 정보