Linux
SED 跨多行替換
我試圖找到這三行:
<!-- <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