使用sed替换多行xml

时间:2018-03-27 09:20:02

标签: regex sed

我尝试使用sed编辑/更改xml文件,但我遇到多线问题

我想要更改的文件有(提取)

<keyStore>
  <location>repository/resources/security/apimanager.jks</location>
  <password>wso2carbon</password>
</keyStore>

我想更改密码(只有keyStore密码,文件有另一个密码标签)

我正在尝试

sed -i 's/\(<keyStore.*>[\s\S]*<password.*>\)[^<>]*\(<\/password.*>\)/\1$WSO2_STORE_PASS\2/g' $WSO2_PATH/$1/repository/conf/broker.xml

但它无法正常工作(一无所获,模式未找到) 如果我在在线测试仪(https://regex101.com/)中测试模式,它似乎可以找到。

另外,我试图用[^] *替换[\ s \ S] *,但在这种情况下,sed会产生语法错误。

我正在使用Ubuntu 16.04.1。

欢迎任何建议

2 个答案:

答案 0 :(得分:2)

使用正则表达式解析XML总是会有问题,因为XML不是常规语言。相反,您可以使用适当的XML解析器,例如使用XMLStarlet

xmlstarlet ed --inplace -u "keyStore/password" -v "$WSO2_STORE_PASS" $WSO2_PATH/$1/repository/conf/broker.xml

答案 1 :(得分:1)

Sed不是这项工作的工具。使用支持XML的工具,例如xsh

open { shift } ;
insert text { shift } replace //keyStore/password/text() ;
save :b ;

运行
xsh script.xsh "$WSO2_PATH/$1/repository/conf/broker.xml" "$WSO2_STORE_PASS"