私のテキストファイルは次のようになります。
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.
これどうやってするの?
編集:ここには本当に良い回答がいくつかありますが、私は最初に機能したものを受け入れることにしましたandが最初でした。本当にありがとうございました!
試す
awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file
どこ
$NF !~ /\.$/
最後の要素がドットで終わっていない行に一致します、{ printf "%s ",$0
この行を末尾スペースを付けて改行なしで印刷します。next ; }
次の行をフェッチし、{print;}
と印刷します。sed
オプションがあると確信しています。
注:これはドットで終わる行で機能しますが、大文字で始まる文の条件はマージされません。 StéphaneChazelasの回答を参照してください。
awk
の場合:
awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
END {if (NR) print RS}'
つまり、各行にレコード区切り記号を追加しないでください(ORS空)。ただし、prepend最初の行になく、現在の行が小文字で始まっていない場合、現在の行の前のレコード区切り文字。それ以外の場合は、最初の行を除き、代わりにスペース文字を付加します。
Perlの場合:
#!/usr/bin/Perl -w
use strict;
my $input = join("", <>);
$input =~ s/\n([a-z])/ $1/g;
print $input;
技術的には、「改行の後に小文字」を「スペースとその小文字」に置き換えたいと思っていました。これは、上記のPerlスクリプトのコアが行うことです。
input
への入力を読み取ります。input
変数を更新して、検索および置換操作の結果を反映させます。sed
を使用すると、N;P;D
サイクル(パターンスペースに常に2行あるようにし、改行の後の最初の文字が小文字の場合、改行をスペースに置き換えます)とt
est-各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
よりもはるかに多くの機能とオプションを備えています。
各段落の間に空白行があることに注意してください。段落すべき少なくとも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.
これを行う別の方法は次のとおりです。
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
import re
print(re.sub(r'\n([a-z])', r' \1', open('file.txt').read(), flags=re.MULTILINE))
これは Jeffの答え と同じ正規表現/置換です