例:
入力ファイル
******************
.WER
+ aaa bbb ccc
+ ddd eee
+ fff ggg hhh
******************
.SDF
+ zzz xxx yyy
+ iii
+ kkk lll
******************
.XCV
+ uuu vvv ggg
+ hhh qqq
+ rrr ttt jjj
******************
必要な出力:
******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************
パターン「+」に一致する行を前の行に追加し、「+」をスペースに置き換えたい。
誰かがawkまたはsed(grepでさえ)コマンドを使用してこの問題を解決できますか?
私はLinuxの初心者です。コマンドライン全体の詳細を説明してください。
質問に/ linuxのタグを付けたので、おそらくGNU sed
を使用しています。次に、-z
オプションを使用して、1つのバッファーでファイル全体を処理できます。使用する:
sed -z 's/\n+//g'
つまり、s
各改行(\n
)の後に+
記号を何も付けずに置き換えます。つまり、+
で始まる行を前の行と結合し、 +
。
私はこれをawk
に同梱しました:
awk 'BEGIN {RS=""}{gsub(/\n\+/,"", $0); print $0}' file
出力:
******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************
すべてのUNIXボックスの任意のシェルで任意のawkを使用し、一度に1行だけをメモリに読み取ります(これまでに投稿された他のソリューションは、入力ファイル全体を一度にメモリに読み取ります)。
$ awk '{printf "%s%s", (sub(/^\+/,"") ? "" : ors), $0; ors=ORS} END{print ""}' file
******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************