使用“sed”删除与模式匹配的“\”续行

使用“sed”删除与模式匹配的“\”续行

我有以下文件:

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 结尾\,它将增加到f2。
  • f仅当计算结果为 0(即为true)时才打印当前行!f
  • 如果在一行的开头设置了标志,它将减 1。这样,先验只有直接匹配的行才会被删除。如果由于换行符而f增加到,则当前行仍将被标记为排除。2如果该行也继续,f则将再次设置为2,以便下一行也仍将被标记。

笔记不幸的是,这只有在匹配模式位于第一的延续组的线。

答案3

使用GNUsed

$ sed -Ez 's/test[^\n]*(\n|\\\n[^\n]*\n)//' input_file
fff
ff
rrr
bbb

相关内容