是否可以使用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
所以它似乎加倍了下一行操作并删除。有什么方法可以修复此命令或以其他方式执行此操作吗?
答案 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