【问题标题】:Bash sed remove before and after a found stringBash sed remove 在找到的字符串之前和之后
【发布时间】:2018-03-11 16:15:36
【问题描述】:

我目前有以下代码:

sed -i "/# My Comment Text/,+2d" /etc/crontab

这将删除此行“# My Comment Text”之后的 2 行,但我也希望它删除此找到的字符串上方的 1 行。如何在我的 1 行 sed 命令中解决此问题?

【问题讨论】:

标签: bash sed


【解决方案1】:

这里有 2 个 sed 命令可以解决问题。如果您的输入文件看起来像

1
2
3
4 # My Comment Text
5
6
7
8

我们要删除第 3、4、5、6 行。

$ sed '/# My Comment Text/ {h;N;N;g}' file  | tac | sed '/# My Comment Text/,+1d' | tac
1
2
7
8

第一个 sed 命令删除匹配行之后的 2 行,不删除匹配行。
然后我们反转文件,删除匹配的行和后面的行(也就是普通文件中的前一行。
重新反转输入,我们就完成了。

【讨论】:

    【解决方案2】:

    这应该可以。我在 Mac 上为 GNU sed 使用了gsed。在 linux 上,您应该可以使用普通的旧 sed

    $ seq 10 | sed 's/^5/5 # my comment text/' | gsed -e ':b;$!{N;1bb;};/# my comment text/,+2!P;D' 1 2 3 7 8 9 10

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2012-02-10
      • 2014-10-07
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      相关资源
      最近更新 更多