0

我想用 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 来实现。

4

3 回答 3

4

我会有这样的 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="***"/>

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

于 2013-09-19T10:55:48.833 回答
1

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

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

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

于 2013-09-19T10:33:44.820 回答
1

使用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="***"/>
于 2013-09-19T11:56:51.573 回答