前任者:
入力ファイル
******************
.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
******************