grep 命令查找文件的 xml 标记值中是否存在引号(") 或撇号(')

问题描述 投票:0回答:1
<?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>

在上面的 XML 中,我需要查找 XML 标记值中是否至少出现一次引号 (

"
) 或撇号 (
'
)。

例如,在

<tag1 info = "AddInf1">Report Map = PRIOR DAY BALTRAN INCREMENTAL " - '</tag1>

grep
应仅评估
>
<
之间的字符串。

我尝试了一个简单的特殊字符搜索。但它正在搜索非 XML 标记值的双引号,例如标头中的双引号

version="1.0"
。我不需要它,并且想避免它。

regex xml command-line grep
1个回答
0
投票

Joachim Sauer 的评论是正确的 - 例如,即使对测试输入进行最简单的调用也会产生以下结果:

$: xmllint file
file:17: parser error : Opening and ending tag mismatch: tag2 line 17 and tag1
            <tag2 info = "AddInf2">Report Map =  " - '</tag1>
                                                             ^

这将使处理转义码变得更容易。

不过,它似乎并没有真正提供一种简单直接的方法来在标签的值空间中搜索任意字符串而不指定标签。也就是说,您真正想要的是在该值空间中查找带有单引号或双引号的记录。

$: grep -n $'>[^<]*[\'"][^<]*<' file
11:                            <Id>asa-"-as'#</Id>
16:            <tag1 info = "AddInf1">Report Map = PRIOR DAY BALTRAN INCREMENTAL " - '</tag1>
17:            <tag2 info = "AddInf2">Report Map =  " - '</tag1>

如果标签分隔字符(

<
>
嵌入在值空间中,例如
&lt;
或在带引号的字符串中(无论如何,这是有问题的XML),这将会被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.