태그 보관물: perl

perl

잘못된 곳에서 끊어진 줄을 어떻게 고칠 수 있습니까? into many. 소문자로 시작하는 줄 다음에 오는

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

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;

기술적으로 “줄 바꾸기 문자 뒤에 소문자”를 “공백과 소문자로”바꾸고 싶었습니다. 위의 펄 스크립트의 핵심은 다음과 같습니다.

  1. 입력을 문자열로 읽습니다 input.
  2. input검색 및 바꾸기 작업의 결과가되도록 변수를 업데이트하십시오 .
  3. 새 값을 인쇄하십시오.

답변

으로 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의 답변 과 동일한 정규 표현식 / 대체입니다