用sed解析和替换多行

时间:2014-08-12 17:34:07

标签: sed

我正在尝试用sed替换3行的块,我遇到了一个奇怪的问题......我正在使用的脚本是

/^#begin$/N;N;s/#begin\n\(.*\)\n#end/replaced \1/

在一个看起来像

的输入文件上
#begin
1
#end

它工作正常,我得到了

replaced 1

但是,如果块之前有一行,则解析失败...相同的脚本应用于

a line
#begin
1
#end

不会改变任何事情。如果我添加两行(说“一行”后跟“另一行”),它再次起作用......我无法理解为什么。 有什么想法吗?

谢谢!

3 个答案:

答案 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