잘못된 위치에서 끊어진 전선을 고치는 방법은 무엇입니까?

잘못된 위치에서 끊어진 전선을 고치는 방법은 무엇입니까?

내 텍스트 파일은 다음과 같습니다.

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 스크립트가 핵심적으로 수행하는 작업입니다.

  1. 입력 문자열을 읽습니다 input.
  2. input검색 및 바꾸기 작업 결과로 변수를 업데이트합니다 .
  3. 새 값을 인쇄합니다.

답변4

사용 sedfmt:

$ 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.

관련 정보