【发布时间】:2018-03-11 16:15:36
【问题描述】:
我目前有以下代码:
sed -i "/# My Comment Text/,+2d" /etc/crontab
这将删除此行“# My Comment Text”之后的 2 行,但我也希望它删除此找到的字符串上方的 1 行。如何在我的 1 行 sed 命令中解决此问题?
【问题讨论】:
我目前有以下代码:
sed -i "/# My Comment Text/,+2d" /etc/crontab
这将删除此行“# My Comment Text”之后的 2 行,但我也希望它删除此找到的字符串上方的 1 行。如何在我的 1 行 sed 命令中解决此问题?
【问题讨论】:
这里有 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 行,不删除匹配行。
然后我们反转文件,删除匹配的行和后面的行(也就是普通文件中的前一行。
重新反转输入,我们就完成了。
【讨论】:
这应该可以。我在 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
【讨论】: