如何用正则表达式提取Tomcat server.xml中的SSL Connector?
如何从Tomcat的server.xml中提取SSL Connector?
你的问题出在原sed命令只匹配单行自闭合的Connector标签——也就是整个<Connector ... />必须在同一行内,而如果你的SSL Connector配置是换行拆分的(很多生产环境会这么写提升可读性),或者你想精准筛选SSL相关的Connector而非所有Connector,这个命令就失效了。下面给你几个可行的解决思路:
1. 精准匹配SSL专属的Connector(推荐)
不管Connector是单行还是多行,我们可以通过SSL特有的属性(比如SSLEnabled="true")来筛选,这样不会误抓HTTP/AJP的Connector:
用sed处理多行场景
如果你的SSL Connector是多行排版的,这个sed命令会从<Connector开始,自动读取后续行直到找到闭合的/>,然后检查是否包含SSL启用属性:
sed -n '/<Connector/{:a;N;/\/>/!ba;/SSLEnabled="true"/p}' server.xml
拆解一下逻辑:
/<Connector/:定位到Connector标签的起始行:a和N:循环读取下一行,把内容合并到当前匹配空间/\/>/!ba:如果还没找到闭合的/>,就继续循环读取/SSLEnabled="true"/p:确认包含SSL启用属性后,打印整个Connector片段
用GNU grep快速匹配
如果你用的是GNU grep,这个命令可以把整个文件当作一个字符串处理,直接提取符合条件的Connector:
grep -zPo '<Connector[^/>]*SSLEnabled="true"[^/>]*\/>' server.xml
-z:将文件视为单一长字符串,忽略换行-Po:使用Perl正则,只输出匹配到的内容- 正则部分确保只抓取包含
SSLEnabled="true"的自闭合Connector标签
2. 修复原sed命令(仅适用于单行Connector)
如果你的SSL Connector确实是单行但没被抓到,可能是原正则没考虑行首的缩进,调整后就能匹配所有单行Connector:
sed -n '/^[[:space:]]*<Connector.*\/>/p' server.xml
^[[:space:]]*用来匹配行首可能存在的空格或制表符缩进,确保不会漏掉带缩进的标签。
3. 用XML工具处理(最佳实践)
正则处理XML始终有局限性(比如标签嵌套、注释干扰等),用专门的XML解析工具才是最可靠的方案,比如xmllint:
xmllint --xpath '//Connector[@SSLEnabled="true"]' server.xml
这个命令会直接提取所有带有SSLEnabled="true"属性的Connector节点,不管格式如何,结果精准且不易出错。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

