基于模式grep和删除行

时间:2014-04-28 13:47:20

标签: unix grep

我有一个包含类似内容的文件,

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的新手吗?

谢谢, 苏尼。

2 个答案:

答案 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