Linux

SED 跨多行替換

  • March 20, 2020

我試圖找到這三行:

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

並將它們替換為:

<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

它沒有找到它,我也嘗試將 \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

這些不會引發任何錯誤,只是不會取消註釋該行。任何建議都會有所幫助,謝謝!

sed 依次讀取每一行,因此它永遠不會匹配多行模式,除非您朝正確的方向輕推它。該N命令從輸入中讀取一行並將其附加到模式空間。

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

可以說,如果您需要除 之外的命令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

引用自:https://serverfault.com/questions/272033