Unix环境下如何通过CLI修改XML文件中的属性值?
问题
想要将XML文件中的该行:
<dp:request domain="@DOMAIN@">
替换为:
<dp:request domain="export">
尝试了以下sed命令但均未成功:
sed -i -e "s/<dp:request domain="export">/<dp:request domain="@DOMAIN@">/g" file.xmlsed -i s#<dp:request domain="export">#<dp:request domain="@DOMAIN@">#g file.xml
对应的XML文件内容:
<?xml version="1.0"?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dp="http://www.datapower.com/schemas/management" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <env:Body> <dp:request domain="@DOMAIN@"> <dp:set-config> <ConfigDeploymentPolicy name="@DEPLOYMENTPOLICYNAME@"> <ModifiedConfig> <Match>*/*/crypto/cert?Name=HHMM&Property=Filename</Match> <Type>change</Type> <Property/> <Value>@HHMM.crypto.cert.FileName@</Value> </ModifiedConfig> </ConfigDeploymentPolicy> </dp:set-config> </dp:request> </env:Body> </env:Envelope>
原因与解决方案
核心问题:替换方向完全写反
你之前的所有命令都是把export替换成@DOMAIN@,和实际需求完全相反,这是替换失败的主要原因。
次要问题:引号未正确转义
第一个命令用双引号包裹整个sed表达式,但表达式内部的双引号没有转义,会被shell错误解析,导致命令截断失效。
正确的sed命令
以下几种方式都能实现需求:
方式1:转义内部双引号
sed -i -e "s/<dp:request domain=\"@DOMAIN@\">/<dp:request domain=\"export\">/g" file.xml
方式2:用单引号包裹表达式(推荐)
单引号内部的特殊字符不会被shell解析,写法更简洁:
sed -i 's/<dp:request domain="@DOMAIN@">/<dp:request domain="export">/g' file.xml
方式3:使用自定义分隔符
sed -i s#<dp:request domain="@DOMAIN@">#<dp:request domain="export">#g file.xml
验证结果
执行命令后,XML文件中对应行会变为:
<dp:request domain="export">
内容的提问来源于stack exchange,提问作者Shubham Gurao
相关产品推荐
相关产品推荐

