私のテキストファイルは次のとおりです。
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スクリプトが重要なことです。
- 入力文字列を読みます
input
。 input
検索と置換操作の結果として変数を更新します。- 新しい値を印刷します。
答え4
使用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
より多くの機能とオプションを提供します。
各段落の間には空行があります。節しなければならない少なくとも1つの空白行で区切ります。空行がない場合、入力例全体は、次のように単一の複数文段落に再フォーマットされます。
$ 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.