我正在尝试使用sed
删除范围。该范围从一个已知的匹配项和接下来的2行开始。假设我想要删除所有以Don't
开头的行,然后是随后的两行。
请注意,我还在sed命令文件中进行替换。因此,我避免在我的解决方案空间中使用-n
和/p
。
由于某种原因,我想限制自己只调用一次sed
。
这是我的数据(data.txt):
Print Me
Please Output This line
Don't Print Me and 2 more lines
This line is no good
So is this one
We should see this line
And this one, too.
这是我期望的输出:
Print Me
Please Output This line
We should see this line
And this one, too.
这里尝试进行翻译:
sed -f delete_dont_plus_2.sed data.txt
使用此delete_dont_plus_2.sed
:
/^Don't/,+2d
这是我的结果:
sed: 1: delete_dont_plus_2.sed: expected context address
我也尝试了这些方法:
/^Don't/,/^Don't/+2d
/^Don't/,{/^Don't/+2}d
这个问题的第二种解决方法:
假设我们想要让这段代码更加健壮。今天需要删除两行,但是谁知道未来会有多少行需要删除。假设我们想要删除直到但不包括We should see this line
这一行。在这个变体中,结果完全相同。再次考虑到我们只能使用受限的BSD sed,所以不能使用像/^Don't/,/^We should see this line/-1d
这样的表达式。
谢谢!
/^Don't/{N;N;d;}
(也就是最后一个分号)。我也感谢 awk 的答案。与 sed 相比,awk 几乎总是我的首选工具。然而,我已经有一个大的 sed 命令文件,其中大部分是替换,所以我受到了限制。感谢您的帮助。 - MarkN
指令将尝试读取文件结尾并失败,打印模式空间中的内容。也许s/^Don't/{$!N;$!N;d;}/
可以防止这种情况在发生。 - potong