次のファイルがあります。
fff
ff
test 23 34 \
45 44
rrr
bbb
このファイルから一致する行を削除したいが、改行をtest
エスケープして行を続行し、\
次の行はその行に属するものと見なす必要があります。
私がコマンドを実行すると
sed "/test/Id" file
test
その行に属する次の行を含む行のみが削除されます。
\
-continuedグループに属するすべての行を削除する方法は?
答え1
test
一致後、パターンの末尾にaがなくなるまで行を累積し、パターンスペースを削除するループを入力します。\
$ sed '/test/{:a; /\\$/N; ta; d;}' file
fff
ff
rrr
bbb
答え2
でこれを行う方法がわかりませんが、sed
次のawk
プログラムは機能するはずです。
awk 'f{f--} /test/{f=1} (f && /\\$/){f=2} !f' file.txt
f
現在の行がパターンと一致する場合、フラグは1に設定されます。- このフラグが設定されて行がaで終わると、2
\
にインクリメントされますf
。 f
現在の行は、評価結果が0(つまりtrue)の場合にのみ印刷されます!f
。- フラグが行の先頭にセットされると、1 ずつ減少します。だから、先験的に直接一致する行のみが削除されます。改行のために増加すると、
f
現在の行はまだ除外されているとマークされます。2
その行も続くと、次の行も表示され続けるようにf
リセットされます。2
ノート残念ながら、これは一致するパターンが次の位置にある場合にのみ機能します。最初グループを継続する行。
答え3
GNUの使用sed
$ sed -Ez 's/test[^\n]*(\n|\\\n[^\n]*\n)//' input_file
fff
ff
rrr
bbb