You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:35:14