我正在尝试使用 删除范围sed。范围来自已知的匹配和接下来的两行。假设我想删除以 开头的所有行Don't,然后删除后面的 2 行。
请注意,我还在 sed 命令文件中进行替换。因此,我避免在我的解决方案空间中使用-nand /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.
Run Code Online (Sandbox Code Playgroud)
这是我的预期输出:
Print Me
Please Output This line
We should see this line
And this one, too.
Run Code Online (Sandbox Code Playgroud)
这是一个尝试:
sed -f delete_dont_plus_2.sed data.txt
Run Code Online (Sandbox Code Playgroud)
以此为delete_dont_plus_2.sed:
/^Don't/,+2d
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
sed: 1: delete_dont_plus_2.sed: expected context address
Run Code Online (Sandbox Code Playgroud)
我也尝试过这些:
/^Don't/,/^Don't/+2d
/^Don't/,{/^Don't/+2}d
Run Code Online (Sandbox Code Playgroud)
解决这个问题的第二种方法:
假设我们想让这段代码更加健壮一些。今天又多了2行需要删除,但谁知道以后还会有多少行。假设我们要删除最多但不包括We should see this line. 在这个问题的变体中,结果完全相同。再次,让我们考虑一个有限的 BSD sed,因此我们不能使用像/^Don't/,/^We should see this line/-1d.
谢谢!
您使用的 sed 可能不支持regexp,+n表单地址。以下是针对此特殊情况的解决方法:
/^Don't/{N;N;d;}
Run Code Online (Sandbox Code Playgroud)
当找到 时,它只是将另外两行读入模式空间^Don't并将其完全删除。
但无论如何,我认为 sed 不是合适的工具,你应该使用awk。例如:
awk '/^Don\047t/{c=2;next} !(c&&c--)' file
Run Code Online (Sandbox Code Playgroud)
沃特
假设我们要删除最多但不包括
We should see this line. 在这个问题的变体中,结果完全相同。
使用 sed 你需要编写相同的 RE 两次:
/^Don't/,/^We should see this line/{/^We should see this line/!d;}
Run Code Online (Sandbox Code Playgroud)
使用 awk 你甚至不需要 RE:
awk 'index($0,"Don\047t")==1{d=1} $0=="We should see this line"{d=0} !d' file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1847 次 |
| 最近记录: |