web-dev-qa-db-ja.com

間違った場所で改行された行を修正するにはどうすればよいですか?

私のテキストファイルは次のようになります。

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が最初でした。本当にありがとうございました!

11
user199046

試す

awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file

どこ

  • $NF !~ /\.$/最後の要素がドットで終わっていない行に一致します、
  • { printf "%s ",$0この行を末尾スペースを付けて改行なしで印刷します。
  • next ; }次の行をフェッチし、
  • {print;}と印刷します。

sedオプションがあると確信しています。

注:これはドットで終わる行で機能しますが、大文字で始まる文の条件はマージされません。 StéphaneChazelasの回答を参照してください。

7
Archemar

awkの場合:

awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
             END {if (NR) print RS}'

つまり、各行にレコード区切り記号を追加しないでください(ORS空)。ただし、prepend最初の行になく、現在の行が小文字で始まっていない場合、現在の行の前のレコード区切り文字。それ以外の場合は、最初の行を除き、代わりにスペース文字を付加します。

10

Perlの場合:

#!/usr/bin/Perl -w
use strict;
my $input = join("", <>);
$input =~ s/\n([a-z])/ $1/g;
print $input;

技術的には、「改行の後に小文字」を「スペースとその小文字」に置き換えたいと思っていました。これは、上記のPerlスクリプトのコアが行うことです。

  1. 文字列inputへの入力を読み取ります。
  2. input変数を更新して、検索および置換操作の結果を反映させます。
  3. 新しい値を印刷します。
4
Jeff Schaller

sedを使用すると、N;P;Dサイクル(パターンスペースに常に2行あるようにし、改行の後の最初の文字が小文字の場合、改行をスペースに置き換えます)とtest-各substitutionサイクルを再開します。

sed -e :t -e '$!N;/\n[[:lower:]]/s/\n/ /;tt' -e 'P;D' infile
4
don_crissti

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.
3
cas

これを行う別の方法は次のとおりです。

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
3
user218374

Python 3

import re
print(re.sub(r'\n([a-z])', r' \1', open('file.txt').read(), flags=re.MULTILINE))

これは Jeffの答え と同じ正規表現/置換です

2
wjandrea