web-dev-qa-db-ja.com

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

例:

入力ファイル

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

2
yen

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

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

つまり、s各改行(\n)の後に+記号を何も付けずに置き換えます。つまり、+で始まる行を前の行と結合し、 +

2
Philippos

私はこれを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
******************
1

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