我正在尝试使用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
这样的表达式。
谢谢!
答案 0 :(得分:3)
您可能正在使用不支持regexp,+n
格式地址的sed。这是针对这种情况的解决方法:
/^Don't/{N;N;d;}
找到^Don't
时,它只是将另外两行读入模式空间,并将其全部删除。
但是无论如何,我认为sed不是正确的工具,您应该改用awk。例如:
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