我试图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看看如何做到这一点。
我更喜欢使用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'