请求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标签值(即>与<之间的文本)**进行转义处理:
- 双引号
"替换为" - 单引号
'替换为'
要求避免全局替换,防止修改标签属性中的引号(如info = "AddInf1"里的引号)。
解决方案Sed命令
sed -E -e ':a s/(>[^<]*")([^<]*<)/\1\"\2/g; ta' -e ':b s/(>[^<]*'\''[^<]*<)/\1\'\2/g; tb' input.xml
命令解释
-E:启用扩展正则表达式,简化分组语法:a/:b:定义循环标签,用于重复替换直到目标区域内无未转义的引号- 第一个替换规则(处理双引号):
- 正则
(>[^<]*")([^<]*<)捕获>后到<前包含双引号的区域 - 将捕获到的双引号替换为
" ta:如果替换成功,回到标签a继续循环,确保当前行内所有标签值里的双引号都被转义
- 正则
- 第二个替换规则(处理单引号):
- 逻辑与双引号处理一致,将单引号替换为
' tb:循环替换直到当前行内所有标签值里的单引号都被转义
- 逻辑与双引号处理一致,将单引号替换为
处理后示例效果
以<tag1>为例,处理后变为:
<tag1 info = "AddInf1">Report Map = PRIOR DAY BALTRAN INCREMENTAL " - '</tag1>
注意事项
该命令仅适用于标签值单行的XML结构。如果存在标签值跨多行的情况,Sed的单行处理逻辑会失效,建议使用专门的XML处理工具(如xmlstarlet)来保证准确性。
内容的提问来源于stack exchange,提问作者Vignesh Govindhan
相关产品推荐
相关产品推荐

