sed 또는 awk를 사용하여 단락 내에서 줄 바꿈을 제거하는 방법

sed 또는 awk를 사용하여 단락 내에서 줄 바꿈을 제거하는 방법

단락에서 줄 바꿈을 제거하는 방법을 알고 싶습니다.이 책그리고 Kindle에서 사용할 수 있는 기타 콘텐츠. 원하는 효과는 빈 줄로 구분된 각 블록을 연속적인 텍스트 줄로 바꾸는 것입니다. 나는 일련의 복잡한 vim 대체 명령을 통해 이 책의 작업을 완료했지만 앞으로는 작업을 완료하는 더 나은 방법을 찾으려고 노력하고 싶습니다.

나는 이 목적에 사용할 수 있는 vim, perl, sed 또는 awk 스크립트를 얻는 것이지만 여러분의 아이디어에 열려 있습니다.

해결책을 찾았지만 미래의 Google 직원을 위한 샘플 입력 및 출력은 다음과 같습니다.

개행 문자를 입력하세요:

Letter 1

_To Mrs. Saville, England._


St. Petersburgh, Dec. 11th, 17—.


You will rejoice to hear that no disaster has accompanied the
commencement of an enterprise which you have regarded with such evil
forebodings. I arrived here yesterday, and my first task is to assure
my dear sister of my welfare and increasing confidence in the success
of my undertaking.

I am already far north of London, and as I walk in the streets of
Petersburgh, I feel a cold northern breeze play upon my cheeks, which
braces my nerves and fills me with delight. Do you understand this
feeling? This breeze, which has travelled from the regions towards
which I am advancing, gives me a foretaste of those icy climes.
Inspirited by this wind of promise, my daydreams become more fervent
and vivid. I try in vain to be persuaded that the pole is the seat of
frost and desolation; it ever presents itself to my imagination as the
region of beauty and delight. There, Margaret, the sun is for ever
visible, its broad disk just skirting the horizon and diffusing a...

단락에서 줄 바꿈 없이 출력:

_To Mrs. Saville, England._


St. Petersburgh, Dec. 11th, 17--.


You will rejoice to hear that no disaster has accompanied the commencement of an enterprise which you have regarded with such evil forebodings. I arrived here yesterday; and my first task is to assure my dear sister of my welfare, and increasing confidence in the success of my undertaking.

I am already far north of London; and as I walk in the streets of Petersburgh, I feel a cold northern breeze play upon my cheeks, which braces my nerves, and fills me with delight. Do you understand this feeling? This breeze, which has travelled from the regions towards which I am advancing, gives me a foretaste of those icy climes. Inspirited by this wind of promise, my day dreams become more fervent and vivid. I try in vain to be persuaded that the pole is the seat of frost and desolation; it ever presents itself to my imagination as the region of beauty and delight. There, Margaret, the sun is for ever visible; its broad disk just skirting the horizon, and diffusing a... 

이제 원래 호기심으로 사용했던 vim 명령은 다음과 같습니다.

ggVG:norm A<space>   -- adds a space to the end of each line
:%s/\v^\s*$/<++>     -- swaps all blank lines with a unique temporary string
ggVGgJ               -- joins all lines without adding a space
:%s/<++>/\r\r/g      -- replaces all occurrences of my unique string with two newline characters 

답변1

단락이 이미 두 개 이상의 줄 바꿈으로 구분되어 있고 각 단락 내의 줄 바꿈만 제거하려는 경우(또는 더 나은 방법은 줄 바꿈을 공백으로 바꾸는 것) 다음을 수행합니다.

perl -00 -lpe 's/\n/ /g' pg42324.txt > pg42324-new.txt
  • -00Perl에게 한 번에 한 단락씩 입력을 읽고 처리하도록 지시합니다(단락 경계는 두 개 이상의 개행입니다).

  • -lPerl의 줄 끝 자동 처리(또는 이 경우 단락 끝)를 켭니다.

  • -pPerl을 다음과 같이 실행합니다 sed. 즉, 스크립트를 수정한 후 입력을 읽고 인쇄합니다.

  • -ePerl에게 다음 인수가 실행할 스크립트임을 알려줍니다.

이러한 옵션에 대한 자세한 내용을 확인하세요 man perlrun.

또는 내부 편집의 경우(원래 .bak 확장자로 백업됨):

perl -i.bak -00 -lpe 's/\n/ /g' pg42324.txt 

단락 내의 행에 선행 또는 후행 공백이 있는 경우 여러 공백을 단일 공백으로 바꿔야 할 수도 있습니다. ; s/ +/ /gPerl 스크립트에 추가하십시오.

perl -00 -lpe 's/\n/ /g; s/  +/ /g' 

하지만 제 생각에는 전체 파일을 마크다운으로 처리하고(굵게, 기울임꼴, 장 제목 등에 마크다운 형식을 추가하는 것조차 가능) 다음을 사용하는 것이 더 나을 것입니다.판독아니면 마크다운에서 epub으로 변환하세요. 결국 Markdown은 선택적 서식 문자가 포함된 일반 텍스트일 뿐입니다. 예를 들어

pandoc pg42324.txt -o pg42324.epub

최소한의 편집은 파일(또는 무엇이든)을 열고 vim각 단락 사이에 빈 줄이 있는지 확인하는 것입니다.

그런데,pandoc을 사용하여 전자책 만들기텍스트나 Markdown 파일에서 .epub 책을 만드는 방법에 대한 짧지만 유용한 일반 소개입니다.


또는 텍스트 전용 버전 대신 .epub 또는 .mobi 버전의 책을 다운로드하는 것이 더 좋습니다. Project Gutenberg는 다양한 형식의 책을 제공합니다.

Mary Shelley의 Frankenstein을 다양한 형식으로 다운로드할 수 있는 링크가 있습니다.

https://www.gutenberg.org/ebooks/42324

답변2

null로 설정 하면 이러한 상황에 유용할 수 awk있는 "단락 모드"가 제공됩니다 .RS

GNU awkRT자동 변수는 단락 사이의 실제 레코드 구분 기호를 캡처하여 깔끔하고 간결하게 만듭니다.

gawk '{$1=$1; print $0 RT}' RS= ORS= pg42324.txt

RS단락 모드를 활성화하려면 공백으로 설정하세요.

ORSRT변수를 통해 명시적으로 구분 기호만 인쇄 하려면 공백으로 설정하세요 .


또는 더 공식적으로 올바른 동등 항목으로 전용 옵션을 통해 합계를 설정하십시오 RS. 스크립트 뒤에 배치된 인수는 일반적으로 스크립트 자체에 대한 입력 파일 이름 또는 인수로 남겨지기 때문입니다.ORS-v

gawk -v RS='' -v ORS='' '{$1=$1; print $0 RT}' pg42324.txt

답변3

줄 바꿈/줄 바꿈을 정규화하려면 다음을 수행하십시오.

wget https://www.gutenberg.org/cache/epub/42324/pg42324.txt
dos2unix pg42324.txt
perl -0777 -pe 's/\n{3,}/\n\n/g' pg42324.txt | less

네가 원한다면제자리에서 편집:

perl -0777 -i -pe 's/\n{2,}/\n\n/g' pg42324.txt

답변4

awk를 사용하십시오.

$ cat tst.awk
NF { buf=buf $0 OFS; next }
{ prtBuf(); print }
END { prtBuf() }

function prtBuf() {
    sub(OFS"$",ORS,buf)
    printf "%s", buf
    buf = ""
}

$ awk -f tst.awk letter
_To Mrs. Saville, England._


St. Petersburgh, Dec. 11th, 17—.


You will rejoice to hear that no disaster has accompanied the commencement of an enterprise which you have regarded with such evil forebodings. I arrived here yesterday, and my first task is to assure my dear sister of my welfare and increasing confidence in the success of my undertaking.

I am already far north of London, and as I walk in the streets of Petersburgh, I feel a cold northern breeze play upon my cheeks, which braces my nerves and fills me with delight. Do you understand this feeling? This breeze, which has travelled from the regions towards which I am advancing, gives me a foretaste of those icy climes. Inspirited by this wind of promise, my daydreams become more fervent and vivid. I try in vain to be persuaded that the pole is the seat of frost and desolation; it ever presents itself to my imagination as the region of beauty and delight. There, Margaret, the sun is for ever visible, its broad disk just skirting the horizon and diffusing a...

관련 정보