SED:匹配后删除 X 行

Mar*_*ark 3 macos sed

我正在尝试使用 删除范围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.

谢谢!

ogu*_*ail 5

您使用的 sed 可能不支持regexp,+n表单地址。以下是针对此特殊情况的解决方法:

/^Don't/{N;N;d;}
Run Code Online (Sandbox Code Playgroud)

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

但无论如何,我认为 sed 不是合适的工具,你应该使用。例如:

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

cf:使用 sed 或 awk 打印符合匹配模式的行


沃特

假设我们要删除最多但不包括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)

  • 对于 awk,另请参阅:/sf/ask/1253598881/ (2认同)