繁体   English   中英

如何替换bash中与正则表达式匹配的xml属性的值?

[英]How to replace value of xml attributes matching a regex in bash?

我想用bash中的文件替换与正则表达式匹配的XML属性的值。

 <Resource name="MailSession" auth="Container" type="javax.mail.Session"
            mail.smtp.host="localhost" mail.smtp.user="foo" mail.smtp.passwd="12345678"
            mail.pop3.host="localhost" mail.pop3.user="foo" mail.pop3.passwd="12345678"/>

应该转化为

 <Resource name="MailSession" auth="Container" type="javax.mail.Session"
            mail.smtp.host="***" mail.smtp.user="foo" mail.smtp.passwd="***"
            mail.pop3.host="***" mail.pop3.user="foo" mail.pop3.passwd="***"/>

使用sed或awk应该可以。

我将有以下sed命令:

sed -E 's@(mail[.][^.]+[.])(host|passwd)="[^"]*"@\1\2="***"@g' file

输出:

 <Resource name="MailSession" auth="Container" type="javax.mail.Session"
            mail.smtp.host="***" mail.smtp.user="foo" mail.smtp.passwd="***"
            mail.pop3.host="***" mail.pop3.user="foo" mail.pop3.passwd="***"/>

您可以在sed中添加-i选项以直接修改文件。

如果您的XML文件称为“ test.xml”,则可以:

cat test.xml | sed 's/host="[^"]*/host="***/g' | sed 's/passwd="[^"]*/passwd="***/g'

如果要从其他位置(例如HTTP连接或其他位置)读取文件,则可以修改管道的第一个命令。

使用awk

 awk -F\" '/host/ {$2=$6="***"}1' OFS=\" file
<Resource name="MailSession" auth="Container" type="javax.mail.Session"
            mail.smtp.host="***" mail.smtp.user="foo" mail.smtp.passwd="***"
            mail.pop3.host="***" mail.pop3.user="foo" mail.pop3.passwd="***"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM