SED替代多条线路

我试图find这三行:

<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> --> 

并将其replace为:

 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 

当我尝试

 sudo sed -i 's:<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />:' /myfile.xml 

它没有find它,我也试图把它\ n,但它仍然没有工作:

 sudo sed -i 's:<!--\n <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />\n -->:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />:' /myfile.xml 

这些不会抛出任何错误,只是不注销行。 任何build议将有助于感谢!

sed依次读取每一行,所以它不会匹配多行模式,除非您将它向正确的方向移动。 N命令从input中读取一行并将其附加到模式空间。

 sed -i -e '/^<!--$/ { N; /\n<Connector port="8009" protocol="AJP\/1\.3" redirectPort="8443" \/>$/ { N; /\n-->$/ { s/^<!--\n//; s/\n-->$// } } }' /myfile.xml 

可以说,如果你需要一个除s以外s命令,那么你应该从sed切换到awk或者perl。 这是一个更加灵活的Perl代码片段,它可以更一般地处理多行注释。

 perl -i -pe ' if (/<!--/) { $_ .= <> while !/-->/; s[<!--\n(<Connector port="8009" protocol="AJP/1\.3" redirectPort="8443" />)\n-->][$1]; }' /myfile.xml 

Sed在逐行的基础上工作。 它可以在多行工作,但它不是这样devise的 – 在我看来,它肯定会显示,当你尝试使用这样的。 但如果你决定这样做,你可能不得不使用寄存器。 检查一些解决scheme,以https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n看看如何做到这一点&#x3002;

我更喜欢使用perl而不是sed来完成这种任务(我的意思是多行)。 在search和replace( BEGIN... )之前必须添加的样板文件不是很明显,但是正则expression式对我来说似乎更清晰:

 perl -i.bak -pe 'BEGIN{undef $/;} s/<!--string-->/string/smg' file.xml 

或者,使用分组缩短expression式并允许您在那里使用正则expression式:

 perl -i.bak -pe 'BEGIN{undef $/;} s/<!--(string_or_regex)-->/\1/smg' file.xml 

它应该在注释标记和代码之间有或没有换行的情况下工作。

改编自:

https://stackoverflow.com/questions/1030787/multiline-search-replace-with-perl

以下是SED中多行命令的说明: http : //docstore.mik.ua/orelly/unix/sedawk/ch06_01.htm

这是一个痛苦的屁股。 您可能要遵循Eduardo的build议,而使用perl -i -p -e

  • /<\!--/ :匹配string
  • :X :这是分支命令“b”的标签
  • /-->/ :匹配string
  • s@...@...@p :带“<! – ”,“ – >”和打印结果
  • d :删除模式空间并开始新的循环
  • N :如果不符合/ – > /则追加一行
  • bX :分支到:X标签
  • p :只是打印一个不符合/ <! – /

 sed -rn ' /<!--/ { :X /-->/ { s@<!--\s*(<.+/>)\s*-->@\1@p d } N bX };p'