如何使用shell脚本从XML中删除注释

时间:2017-03-23 06:38:52

标签: xml shell

我想从server.xml获取tomcat服务器配置文件的端口。

我的server.xml在下面。

如何在没有评论部分的情况下从server.xml获取端口

我只想在没有8080的情况下只获得50000。

<Connector port="50000"  maxHttpHeaderSize="8192" protocol="HTTP/1.1"
           maxThreads="2000" minSpareThreads="50" maxSpareThreads="150" />    
<!--
<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
-->

2 个答案:

答案 0 :(得分:0)

以下是不同的结果,请查看周围的更多详细信息。

grep -oP 'port=.*? (?=maxHttpHeaderSize)' server.xml
port="50000"

grep -oP 'port=\K.*? (?=maxHttpHeaderSize)' server.xml
"50000"

grep -oP 'port="\K.*?(?="  maxHttpHeaderSize=)'
50000

答案 1 :(得分:0)

从我可以提出的文本文件中删除所有注释的最简单的解决方案是:

| sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' |

解释:

sed会输入null这样的字符:

<Connector port="50000"  maxHttpHeaderSize="8192" protocol="HTTP/1.1"
           maxThreads="2000" minSpareThreads="50" maxSpareThreads="150" />    
\0<!--
<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
-->\0

grep -z将该字符视为&#34;行分隔符&#34;并移除中间部分,最后tr -d将再次移除\0,以便后续的grep不会将其视为二进制文件。

只需将它与您正在使用的grep结合使用,例如:

 cat server.xml | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -o 'port="[0-9]*' | grep -o '[0-9]*$'

输出:

50000