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

请求Sed命令:仅转义XML标签值中的双引号与单引号

仅转义XML标签值区域引号的Sed命令方案

需求说明

现有如下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>

需要**仅对XML标签值(即>与<之间的文本)**进行转义处理:

  • 双引号"替换为&quot;
  • 单引号'替换为&apos;
    要求避免全局替换,防止修改标签属性中的引号(如info = "AddInf1"里的引号)。

解决方案Sed命令

sed -E -e ':a s/(>[^<]*")([^<]*<)/\1\&quot;\2/g; ta' -e ':b s/(>[^<]*'\''[^<]*<)/\1\&apos;\2/g; tb' input.xml

命令解释

  1. -E:启用扩展正则表达式,简化分组语法
  2. :a/:b:定义循环标签,用于重复替换直到目标区域内无未转义的引号
  3. 第一个替换规则(处理双引号):
    • 正则(>[^<]*")([^<]*<)捕获>后到<前包含双引号的区域
    • 将捕获到的双引号替换为&quot;
    • ta:如果替换成功,回到标签a继续循环,确保当前行内所有标签值里的双引号都被转义
  4. 第二个替换规则(处理单引号):
    • 逻辑与双引号处理一致,将单引号替换为&apos;
    • tb:循环替换直到当前行内所有标签值里的单引号都被转义

处理后示例效果

以<tag1>为例,处理后变为:

<tag1 info = "AddInf1">Report Map = PRIOR DAY BALTRAN INCREMENTAL &quot; - &apos;</tag1>

注意事项

该命令仅适用于标签值单行的XML结构。如果存在标签值跨多行的情况,Sed的单行处理逻辑会失效,建议使用专门的XML处理工具(如xmlstarlet)来保证准确性。

内容的提问来源于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 10:17:18