如何使用 sed 编辑模式后的下一行?

如何使用 sed 编辑模式后的下一行?

使用sed,如何搜索以 结尾的行foo,然后编辑以 开头的下一行#bar

或者换句话说,#如果下一行以 开头并且上一行以.#bar结尾,我想从下一行中删除注释。foo

例如:

This is a line ending in foo
#bar is commented out
There are many lines ending in foo
#bar commented out again

我试过:

sed -i 's/^foo\n#bar/foo\nbar/' infile

答案1

sed '/foo$/{n;s/^#bar/bar/;}'

是您的要求的直译。n是为了next.

现在,这在以下情况下不起作用:

line1 foo
#bar line2 foo
#bar

或者:

line1 foo
line2 foo
#bar

n因为不会搜索拉入模式空间的行foo

您可以通过在下一行被拉入模式空间后循环回到开头来解决这个问题:

sed '
  :1
  /foo$/ {
     n
     s/^#bar/bar/
     b1
  }'

答案2

使用N;P;D循环并尝试每次替换:

sed '$!N;s/\(foo\n\)#\(bar\)/\1\2/;P;D' infile

仅当它位于以 结尾的行之后时,才会删除前导#from ,否则它只会打印未修改的模式空间。#barfoo


显然,你想取消注释 US 镜像,/etc/pacman.d/mirrorlist其中是完全不同的事情:

sed -e '/United States/,/^$/{//!s/^#//' -e '}' /etc/pacman.d/mirrorlist

这将取消注释美国部分中的所有镜像/etc/pacman.d/mirrorlist

答案3

尝试:

sed -e '$!N;/foo\n#bar/s/\(\n\)#/\1/;P;D'

相关内容