Linux에서 문장을 별도의 줄에 넣는 방법

Linux에서 문장을 별도의 줄에 넣는 방법

텍스트 파일의 문장을 별도의 줄에 배치하는 과제가 있습니다. 이와 같은 것이 거의 작동합니다.

cat file.txt | tr '.' '\n'

하지만 나는 내 문장에서 점, 물음표, 느낌표를 잃고 싶지 않습니다. 어떻게 해야 하나요?

답변1

실제 데이터 예를 보지 않고는 확실히 말할 수 없지만 어떻게 하시겠습니까?아마도.찾고 있는 것은 각 발생 !후에 개행 문자를 추가하는 것 입니다 ?. 세미콜론( ;)은 실제로 문장의 끝을 표시하지 않기 때문에 무엇을 하려는지 모르겠습니다 . 그것은 당신에게 달려 있습니다.

어쨌든 시도해 볼 수 있습니다 sed.

$ echo 'This is a sentence! And so is this. And this one?' | 
    sed 's/[.!?]  */&\n/g' 
This is a sentence! 
And so is this. 
And this one?

s///교체 연산자 입니다 . 일반적인 형식은 로 s/pat/replacement대체된다는 것입니다 . 마지막 것은 모든 발생에 대해 교체를 실행하게 합니다 . 그렇지 않으면 첫 번째 항목에서 중지됩니다. 이것은 "일치하는 모든 것"을 의미하는 특별한 구조입니다 . 따라서 여기서는 , 또는 중 하나를 일치하는 항목과 개행 문자로 바꿉니다 .patreplacementgpat&sed.!?

텍스트에 약어(예: )가 포함될 수 있는 경우 e.g.다음 문자가 대문자인 경우에만 바꿀 수 있습니다.

$ echo 'This is a sentence! And so is this. And this one? Negative, i.e. no.' | sed 's/\([.!?]\) \([[:upper:]]\)/\1\n\2/g' 
This is a sentence!
And so is this.
And this one?
Negative, i.e. no.

이는 문장을 정의한 후 다음 문자를 대문자로 Dr. Jones said hello.가정하므로 문장을 올바르게 처리 하지 않는다는 점에 유의하세요 . 그러나 이제 우리는 단순한 질문과 답변 형식을 훨씬 넘어서는 수준의 복잡성을 갖게 되었으며 실제로는 완전한 자연어 파서가 필요합니다..Dr

답변2

노력하다:

sed -e :1 -e 's/\([.?!]\)[[:blank:]]\{1,\}\([^[:blank:]]\)/\1\
\2/;t1'

다음과 같이 입력하면:

Sentence 1. Sentence 1.2? Sentence 2!? Sentence 3.
Sentence 4... Sentence 5.

그것은 다음을 제공합니다:

Sentence 1.
Sentence 1.2?
Sentence 2!?
Sentence 3.
Sentence 4...
Sentence 5.

(그리고 POSIX입니다).

답변3

재치 있는 말 너머에는 삶이 있다…

문장 분할기는 아직 준비되지 않았습니다. 항상 수정해야 할 세부 사항이 하나 있습니다: Perl 여러 줄 코드!

#!/usr/bin/perl

use strict;
my $pont=qr{[.!?]+};                   ## pontuation
my $abrev=qr{\b(?:Pr|Dr|Mr|[A-Z])\.};  ## abreviations

$/="";   

while(<>){ chomp;                      ## for each paragraph,

  s/\h*\n\h*/ /g;                      ## remove \n
  s/($pont)\h+(\S)/$1\n$2/g;           ## pontuation+space
  s/($abrev)\n/$1 /g;                  ## undo \n after abreviations

  print "$_\n\n";
}

그래서:

A single ‘-’ operand is not really an option ! It stands for
standard input. Or for standard output ? For example:
‘smth -’ reads from stdin; and is equal
to plain ‘smth’... Could it appear as any operand that
requires a file name ? Certainly !

Robert L. Stevenson wrote  Dr. Jekyll and Mr. Hyde. Back in 12.12.1886

the end

출력은 다음과 같습니다

A single ‘-’ operand is not really an option !
It stands for standard input.
Or for standard output ?
For example: ‘smth -’ reads from stdin; and is equal to plain ‘smth’...
Could it appear as any operand that requires a file name ?
Certainly !

Robert L. Stevenson wrote  Dr. Jekyll and Mr. Hyde.
Back in 12.12.1886

the end

답변4

이 임무에는 몇 가지 함정이 있습니다. 한 가지 옵션은 다음과 같습니다.

sed 's/\([.?!;]\) */\1\n/g' file.txt

[.?!;]이는 지정된 문자 세트( , 적절하게 콜론 추가 또는 세미콜론 제거) 의 문자를 대체하고 , 그 뒤에 선택적 공백( *), 대체 문자( \1및 사이 일치로 확장됨) 및 개행 문자( )를 대체합니다.\(\)\n

관련 정보