내 텍스트 파일은 다음과 같습니다
This is one
sentence that is broken.
However this is a good one.
And this
one is
somehow, broken into
many.
소문자로 시작하는 줄 다음에 오는 줄의 후행 줄 바꿈 문자를 제거하고 싶습니다.
따라서 다음과 같아야합니다.
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.
어떻게해야합니까?
편집 : 여기에 정말 좋은 답변이 있지만 가장 효과 적이고 빠른 첫 번째 답변을 선택했습니다 . 정말 고마워요!
답변
시험
awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file
어디
$NF !~ /\.$/
마지막 요소가 점으로 끝나지 않는 라인 일치,{ printf "%s ",$0
이 줄을 후행 공백으로 인쇄하고 줄 바꿈없이next ; }
다음 줄을 가져와{print;}
인쇄하십시오.
sed
옵션 이있을 것이라고 확신 합니다.
참고 : 점으로 끝나는 줄에서 작동하지만 대문자로 시작하는 문장의 조건은 병합되지 않습니다. Stéphane Chazelas의 답변을 참조하십시오.
답변
로 awk
:
awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
END {if (NR) print RS}'
즉, 각 행에 레코드 구분 기호를 추가하지 마십시오 (또는 비어 있음). 그러나 첫 번째 행이 아니고 현재 행이 소문자로 시작하지 않으면 현재 행 앞에 레코드 구분 기호를 추가 하십시오. 그렇지 않으면 첫 번째 행을 제외하고 공백 문자를 앞에 추가하십시오.
답변
펄에서 :
#!/usr/bin/perl -w
use strict;
my $input = join("", <>);
$input =~ s/\n([a-z])/ $1/g;
print $input;
기술적으로 “줄 바꾸기 문자 뒤에 소문자”를 “공백과 소문자로”바꾸고 싶었습니다. 위의 펄 스크립트의 핵심은 다음과 같습니다.
- 입력을 문자열로 읽습니다
input
. input
검색 및 바꾸기 작업의 결과가되도록 변수를 업데이트하십시오 .- 새 값을 인쇄하십시오.
답변
으로 sed
당신이 사용할 수있는 N;P;D
사이클 (그래서 항상에 관한 것은 패턴 공간에 두 개의 라인을 가지고와 줄 바꿈 후 첫 번째 문자가 소문자 인 경우 공백으로 줄 바꿈 대체)와 t
동부 표준시 – 각 후 그런 식으로 s
당신이주기를 다시 시작 ubstitution를 :
sed -e :t -e '$!N;/\n[[:lower:]]/s/\n/ /;tt' -e 'P;D' infile
답변
사용 sed
하여 fmt
:
$ sed -e '1n; s/^[[:upper:]]/\n&/' input.txt | fmt
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.
sed 스크립트는 대문자로 시작하는 모든 행 앞에 개행을 삽입합니다 (첫 번째 입력 행 제외). sed
그런 다음 fmt
결과 단락을 재구성하기 위해 출력으로 파이프됩니다 .
또는 par
설치 한 경우 사용 하십시오. 또 다른 단락 재구성 기이지만보다 fmt
많은 기능과 옵션을 제공하는 것보다 훨씬 기능이 뛰어납니다.
각 단락 사이에 빈 줄이 있습니다. 단락 은 하나 이상의 빈 줄로 서로 분리 해야 합니다. 빈 줄이 없으면 전체 입력 샘플이 단일 다중 문장 단락으로 다시 포맷됩니다. 예 :
$ fmt input.txt
This is one sentence that is broken. However this is a good one.
And this one is somehow, broken into many.
다시 포맷 한 후 빈 줄을 제거해야하는 경우 sed
다시 연결하면됩니다. 그러나 원래 입력에 있었던 줄을 포함하여 모든 빈 줄이 제거됩니다. 예 :
$ sed -e '1n; s/^[[:upper:]]/\n&/' input.txt | fmt | sed -e '/^$/d'
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.
답변
이를 수행 할 수있는 다른 방법은 다음과 같습니다.
perl -lpe '$\ = /\.$/ ? $/ : $"' data
여기서 : $\
=> ORS
, $/
=> IRS
= \n
, $"
=space
perl -pe '$_ .= <>, eof or redo if s/[^.]\K\n/ /' data
sed -e '
:a
/\.$/!N
s/\n/ /
ta
' data
답변
파이썬 3
import re
print(re.sub(r'\n([a-z])', r' \1', open('file.txt').read(), flags=re.MULTILINE))
이것은 Jeff의 답변 과 동일한 정규 표현식 / 대체입니다