我有一个包含类似内容的文件,
n-p: sd/is/b-t/km/lk
n-a: delete
这两行在整个文件中重复n次,
我想匹配包含/ b-t /的第一行 如果第二行是删除,那么我想删除这两行,并将输出放入另一个文件而不更改第一个文件。
所以简而言之if(first line contains /b-t/ and second line is delete) then delete both the lines
。
你们可以建议一种方法,因为我是unix的新手吗?
谢谢, 苏尼。
答案 0 :(得分:1)
您可以使用此sed
,
sed ':loop; N; /.*b-t.*\n.*delete/{d; t loop;}; P;D;' yourfile > new_output
<强>测试强>
yourfile:
n-p: sd/is/b-t/km/lk
n-a: delete
.. some ... text
n-p: sd/is/b-t/km/lk not match
.. some lines
.. some text
n-p: sd/is/b-t/km/lk
n-a: delete
.. some ..
执行命令
sat:~# sed ':loop; N; /b-t.*\n.*delete/{d;t loop;}; P;D;' yourfile
.. some ... text
n-p: sd/is/b-t/km/lk not match
.. some lines
.. some text
.. some ..
sat:~#
答案 1 :(得分:0)
我知道这很脏:
awk -v RS="" '{gsub("n-p: \\S*/b-t/[^\n]*\n[^\n]*delete[^\n]*\n?","")}7' file
示例:
kent$ cat f
n-p: sd/is/b-t/km/lk
n-a: delete
n-p: sd/is/bXt/km/lk
n-a: delete
n-p: sd/is/b-t/km/lk
n-a: foo
n-p: sd/are/b-t/km/lk
n-a: delete
kent$ awk -v RS="" '{gsub("n-p: \\S*/b-t/[^\n]*\n[^\n]*delete[^\n]*\n?","")}7' f
n-p: sd/is/bXt/km/lk
n-a: delete
n-p: sd/is/b-t/km/lk
n-a: foo