我有以下文件:
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 结尾
\
,它将增加到f
2。 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