trを使用したテキストの書式設定中に問題が発生しました。

trを使用したテキストの書式設定中に問題が発生しました。

次の形式のテキストを含むファイルがあります。

line 1,
line 2,
< Blank line >
line 3,
line 4,
< Blank line >
line 5,
line 4,
< Blank line >

次の形式に設定する必要があります。

line 1,line 2,
< Blank line >
line 3,line 4,
< Blank line >
line 5,line 4,
< Blank line >

だから私は努力しています:

tr -d '\n' < myfile.txt > myfile_res.txt

しかし、その後、すべてを接続します。

line 1,line 2,line 3,line 4,line 5,line 4

私にとって必要なのは、文字が含まれている行からのみ '\ n'を削除し、空の行を保持することです。うまくいくと思います。

コーディングする方法を知っていますか?

ベストアンサー1

tr一度に1文字しか表示されないため、コンテキストを確認する必要がある場合は実際には機能しません。

セクションは空行で区切られているため、短絡モードは次のようなawk場合に適しています。

awk -vRS= '{gsub(/\n/, ""); print $0 "\n"}' myfile.txt

空白行で区切られた空の読み込み「レコード」を設定すると、RS各レコードに対して改行を削除してから、追加の改行を使用してレコードを印刷します。

Perlでも似ていますが、Perlは他の文字のように最後の改行をロードするため、2つの追加の改行があります。

perl -00ne 's/\n//g; print "$_\n\n"' myfile.txt

両方とも、複数の空行を1つの空行として扱います。


sedを使用してこれを実行できますが、2行以上のブロックをサポートする必要がある場合は、最初の試みよりも少し複雑です。

sed -n 'H; $bL; /./d; :L; x; s/\n//g; s/$/\n/; p;' myfile.txt

現在の行を保持バッファ( H)に追加し、これが最後の行( )であることを確認し$、この場合 L( bL)に分岐します。存在しない場合は()文字があることを確認し/./、存在する場合は(d)行を削除して最初に戻ります。

それ以外の場合(行が空白)、入力時にバッファと現在の行(パターンスペース)をL交換し()、改行を削除し()、最後に別の改行を追加し()、暗黙的にパターンスペースを印刷します。 self 前の空の行の後に収集した行です。ここで、追加の空行は、追加の空行を生成します。xs/\n//gs/$/\n/

おすすめ記事