次の形式のテキストを含むファイルがあります。
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 前の空の行の後に収集した行です。ここで、追加の空行は、追加の空行を生成します。x
s/\n//g
s/$/\n/
答え2
このsedコマンドを使用できます
sed '/,/{N;s/\n//;s/$//;}' myfile.txt