您可以使用sed删除匹配项吗?仅限某些行?

时间:2017-08-02 21:36:08

标签: linux bash sed

是否可以使用sed搜索特定的代码块并删除匹配项并仅删除其后的特定行?

例如,如果我有这样的块,并且想要删除特殊标记1并且只删除它后面的第二行:

special marker 1
text 1
text 2
text 3

我可以使用sed搜索块的实例,并提供:

text 1
text 3

我知道如下命令:

sed -i '/START/,/END/ {/special marker 1/{n;n;N;d;}}' filename;

但是,这个命令只留给我:

text 1

所以它似乎加倍了下一行操作并删除。有什么方法可以修复此命令或以其他方式执行此操作吗?

4 个答案:

答案 0 :(得分:3)

告诉sed打印以跳过2行:

sed -ni '/special marker 1/{n;p;n;n};p' filename

如果只想输出两行,则可以用

替换该命令
sed -ni '/special marker 1/{n;p;n;n;p}' filename

答案 1 :(得分:1)

使用awk即可:

awk '/special marker 1/{p=NR; next} p && NR==p+2{p=0; next} 1' file
text 1
text 3

答案 2 :(得分:1)

尝试一次跟踪awk解决方案。

解决方案1:

awk '/special marker 1/{;if(getline var){print var;if(getline var1){next};next}} 1'   Input_file

解决方案第二:

awk '/special marker 1/{getline;if(NF){print};if(NF){;getline};next} 1'  Input_file

答案 3 :(得分:1)

sed -i '/START/,/END/ {/special marker 1/{N;N;D};P;d}' filename