使用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
答案3
尝试:
sed -e '$!N;/foo\n#bar/s/\(\n\)#/\1/;P;D'