내 텍스트 파일은 다음과 같습니다.
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.
어떻게 해야 하나요?
편집: 여기에는 정말 좋은 답변이 있지만 작동하는 첫 번째 답변을 수락하기로 선택했습니다.그리고가장 이르다. 다들 감사 해요!
답변1
그리고 awk
:
awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
END {if (NR) print RS}'
즉, 각 행에 레코드 구분 기호를 추가하지 마십시오(ORS는 비어 있음). 하지만접두사현재 줄 앞의 레코드 구분 기호입니다(첫 번째 줄이 아니고 현재 줄이 소문자로 시작하지 않는 경우). 그렇지 않으면 첫 번째 줄을 제외하고 선행 공백 문자를 추가합니다.
답변2
노력하다
awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file
어디
$NF !~ /\.$/
마지막 요소가 점으로 끝나지 않는 줄과 일치합니다.{ printf "%s ",$0
줄 바꿈 없이 후행 공백을 사용하여 이 줄을 인쇄합니다.next ; }
다음 행을 가져옵니다.{print;}
그리고 인쇄하세요.
나는 옵션이있을 것이라고 확신합니다 sed
.
참고: 이는 점으로 끝나는 줄에 적용되지만 대문자로 시작하는 문장의 조건은 병합되지 않습니다. Stéphane Chazelas의 답변을 참조하십시오.
답변3
펄에서는:
#!/usr/bin/perl -w
use strict;
my $input = join("", <>);
$input =~ s/\n([a-z])/ $1/g;
print $input;
기술적으로 "줄 바꿈 뒤에 소문자"를 "공백과 소문자"로 바꾸려고 합니다. 이는 위의 Perl 스크립트가 핵심적으로 수행하는 작업입니다.
- 입력 문자열을 읽습니다
input
. input
검색 및 바꾸기 작업 결과로 변수를 업데이트합니다 .- 새 값을 인쇄합니다.
답변4
사용 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.