SED:比赛后删除X行

时间:2019-05-10 15:31:19

标签: macos sed

我正在尝试使用2018-12-20删除范围。范围是从已知比赛和接下来的2行开始。假设我要删除所有以sed开头的行,然后删除其后的2行。

请注意,我也在sed命令文件中进行替换。因此,我避免在解决方案空间中使用Don't-n

无论出于何种原因,我都想限制一次sed的调用。

这是我的数据(data.txt):

/p

这是我的预期输出:

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

此问题的第二种方法:

比方说,我们想使这段代码更健壮。今天有2行需要删除,但是谁知道将来会有几行。假设我们要删除最多但不包括/^Don't/,/^Don't/+2d /^Don't/,{/^Don't/+2}d 。在这个问题的变体中,结果完全相同。再次,让我们考虑一个有限的BSD sed,以便我们不能使用像We should see this line这样的表达式。

谢谢!

3 个答案:

答案 0 :(得分:3)

您可能正在使用不支持regexp,+n格式地址的sed。这是针对这种情况的解决方法:

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

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

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

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

c.f:Printing with sed or awk a line following a matching pattern


wrt

  

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

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

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

使用awk,您甚至都不需要RE:

awk 'index($0,"Don\047t")==1{d=1} $0=="We should see this line"{d=0} !d' file

答案 1 :(得分:1)

使用GNU sed:

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

输出:

Print Me
Please Output This line
We should see this line
And this one, too.

答案 2 :(得分:0)

这可能对您有用(GNU sed):

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

此解决方案从遇到正则表达式起就进行计数。

如果紧随regexp的两行之一也是regexp,则重新开始计数。

一种不具GNU特定性和编程性的解决方案:

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