SED:匹配后删除X行

3

我正在尝试使用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这样的表达式。

谢谢!

3个回答

5

你可能正在使用不支持 regexp,+n 形式地址的 sed。这里提供了一个特定情况下的解决方法:

/^Don't/{N;N;d;}

当找到^Don't时,它会将另外两行读入模式空间并将它们全部删除。

但无论如何,我认为sed不是这个问题的正确工具,您应该使用。例如:

awk '/^Don\047t/{c=2;next} !(c&&c--)' file

c.f: 使用sed或awk打印匹配模式后的一行


wrt

假设我们想要删除直到但不包括We should see this line。在这个问题的变体中,结果完全相同。

使用sed,您需要两次编写相同的RE:

/^Don't/,/^We should see this line/{/^We should see this line/!d;}

使用awk甚至不需要正则表达式:
awk 'index($0,"Don\047t")==1{d=1} $0=="We should see this line"{d=0} !d' file

1
对我来说可以工作。我必须添加一些 MAC 乐趣:/^Don't/{N;N;d;}(也就是最后一个分号)。我也感谢 awk 的答案。与 sed 相比,awk 几乎总是我的首选工具。然而,我已经有一个大的 sed 命令文件,其中大部分是替换,所以我受到了限制。感谢您的帮助。 - Mark
1
我明白你的意思,但不能代表我社区中所有其他Mac用户。在某种程度上,我被困在最低公共分母中。再次感谢您的帮助。作为一个额外的问题,如果我们不知道要删除多少行,脚本会如何改变呢?相反,我们想要删除第一行之前以'/^We should see this line/'开头的所有行。对于这个问题的变体,输出应该是相同的。 - Mark
2
有关awk,请参见:https://dev59.com/oWMm5IYBdhLWcg3wDrpR - Sundeep
1
当正则表达式是最后一行或倒数第二行时,此解决方案可能无法正常工作,因为N指令将尝试读取文件结尾并失败,打印模式空间中的内容。也许s/^Don't/{$!N;$!N;d;}/可以防止这种情况在发生。 - potong

1

使用GNU sed:

sed "/^Don't/,+2d" file

输出:

打印我
请输出这一行
我们应该看到这一行
还有这一行。

0
这可能适用于你(GNU sed):
sed '/^Don'\''t/{s/.*/X/;h;d};x;/X/!{x;b};s/^/X/;/^XXX/z;x;d' file

这个解决方案从遇到正则表达式的时间开始计数。

注意:如果跟在正则表达式后面的两行中有一行也是正则表达式,计数会重新开始。

一个不太依赖GNU且更加程序化的解决方案:

sed '/^Don'\''t/{s/.*/X/;h;d};x;/X/!{x;b};s/^/X/;/^XX\{2\}/s/.*//;x;d' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接