如何用grep命令查找XML标签值中的引号或撇号
用grep仅检测XML标签值中的单/双引号
需求说明
需要检查XML文本中,**标签值(即标签的>与<之间的内容)**是否存在单引号(')或双引号("),同时要避免误匹配标签属性里的引号(比如version="1.0"这类属性值的引号)。
给定测试XML:
<?xml version="1.0" encoding="UTF-8"?> <Document> <InnerDoc> <GrpHdr> <MsgId>aaa.xml</MsgId> <CreDtTm>2023-08-15T13:35:33.0Z</CreDtTm> <MsgRcpt> <Id value="111"> <OrgId> <Othr> <Id>asa-"-as'#</Id> </Othr> </OrgId> </Id> </MsgRcpt> <tag1 info = "AddInf1">Report Map = PRIOR DAY BALTRAN INCREMENTAL " - '</tag1> <tag2 info = "AddInf2">Report Map = " - '</tag1> </GrpHdr> </InnerDoc> </Document>
解决方案
使用带正向预查和反向预查的grep正则表达式,精准定位标签值区域:
grep -nP '(?<=>)[^<]*["\'][^<]*(?=<)' your_file.xml
命令解释
-n:显示匹配行的行号-P:启用Perl兼容正则表达式(PCRE),支持正向/反向预查(?<=>):反向预查,匹配前面是>的位置,确保我们在标签的闭合符号之后[^<]*:匹配任意非<的字符(因为标签值结束于下一个<)["\']:匹配单引号或双引号(?=<):正向预查,匹配后面是<的位置,确保我们在标签的起始符号之前
测试结果
针对给定的XML,该命令会输出以下行:
9: <Id>asa-"-as'#</Id> 13: <tag1 info = "AddInf1">Report Map = PRIOR DAY BALTRAN INCREMENTAL " - '</tag1> 14: <tag2 info = "AddInf2">Report Map = " - '</tag1>
这些行都是标签值中包含引号的行,完全避开了属性里的引号(比如XML声明的version="1.0"、<Id value="111">里的引号都不会被匹配)。
补充说明
如果只需要判断是否存在匹配(不需要输出具体行),可以用-q参数静默模式,通过返回值判断:
grep -qP '(?<=>)[^<]*["\'][^<]*(?=<)' your_file.xml # 执行后用echo $?查看结果,0表示存在匹配,1表示不存在
内容的提问来源于stack exchange,提问作者Vignesh Govindhan
相关产品推荐
相关产品推荐

