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

気の利いた言葉を超えて人生があります。

文章分割器はまだ準備されていません。常に修正する必要がある詳細が1つあります: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

このミッションにはいくつかのトラップがあります。 1つのオプションは次のとおりです。

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

[.?!;]これは、指定された文字セット(、適切にコロンの追加、またはセミコロンの削除)の文字を置き換え、その後にオプションのスペース()、代替*文字(\1および間の一致で拡張)、および改行文字()を置き換えます。\(\)\n

関連情報