텍스트 파일의 문장을 별도의 줄에 배치하는 과제가 있습니다. 이와 같은 것이 거의 작동합니다.
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
대체된다는 것입니다 . 마지막 것은 모든 발생에 대해 교체를 실행하게 합니다 . 그렇지 않으면 첫 번째 항목에서 중지됩니다. 이것은 "일치하는 모든 것"을 의미하는 특별한 구조입니다 . 따라서 여기서는 , 또는 중 하나를 일치하는 항목과 개행 문자로 바꿉니다 .pat
replacement
g
pat
&
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