我正在尝试用sed替换3行的块,我遇到了一个奇怪的问题......我正在使用的脚本是
/^#begin$/N;N;s/#begin\n\(.*\)\n#end/replaced \1/
在一个看起来像
的输入文件上#begin
1
#end
它工作正常,我得到了
replaced 1
但是,如果块之前有一行,则解析失败...相同的脚本应用于
a line
#begin
1
#end
不会改变任何事情。如果我添加两行(说“一行”后跟“另一行”),它再次起作用......我无法理解为什么。 有什么想法吗?
谢谢!
答案 0 :(得分:0)
围绕特定模式的操作使用{ .. }
:
/^#begin$/{N;N;s/#begin\n\(.*\)\n#end/replaced \1/}
例如:
$ cat file
a line
#begin
1
#end
$ sed '/^#begin$/{N;N;s/#begin\n\(.*\)\n#end/replaced \1/}' file
a line
replaced 1
某些版本的sed
(BSD)在结束括号之前需要尾随;
。请使用以下内容:
sed '/^#begin$/{N;N;s/#begin\n\(.*\)\n#end/replaced \1/;}' file
答案 1 :(得分:0)
对于涉及多行的任何内容,您最好使用awk。例如,使用GNU awk进行多字符RS和gensub():
$ gawk -v RS='^$' -v ORS= '{$0=gensub(/#begin\n([^\n]+)\n#end/,"replaced \\1","")}1' file
a line
replaced 1
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed '/#begin/,/#end/c\replaced 1' file