前の行にパターンに一致する行を追加する方法

前の行にパターンに一致する行を追加する方法

前任者:

入力ファイル

******************
.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初心者です。コマンドライン全体について詳しく説明してください。

答え1

質問に/ linuxタグを付けたので、おそらくGNUを使用しているでしょうsed。その後、この-zオプションを使用して1つのバッファでファイル全体を処理し、次のものを使用できます。

sed -z 's/\n+//g'

これは、次のs各改行文字()をnullに置き換えることを意味します。つまり、前の行から始まる行をリンクします。\n+++

答え2

私はこれを持ってきました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
******************

答え3

すべての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
******************

関連情報