sed正则表达式查询

时间:2014-09-29 13:41:04

标签: regex unix sed

要更改以下行中的Tomcat密码

<user username="user1" password="tomcat" roles="tomcat"/>

我正在尝试

sed -i s/'username=\"user1\" password=\".*\"'/'username=\"user1\" password=\"NEWPASS\"'/g tomcat-users.xml

但结果行将是

<user username="user1" password="NEWPASS"/>

如何更改正则表达式以不切断最后一个属性? 我希望它看起来像

<user username="user1" password="NEWPASS" roles="tomcat"/>

4 个答案:

答案 0 :(得分:2)

请尝试以下替换:

sed -i 's/password="[^"]*"/password="NEWPASS"/' tomcat-users.xml

如果您只想在与user1对应的行中进行替换,请指定regexp address

sed -i '/username="user1"/ s/password="[^"]*"/password="NEWPASS"/' tomcat-users.xml

说明:

# for lines that match
# this regexp...
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
'/username="user1"/ s/password="[^"]*"/password="NEWPASS"/'
#                   ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
#                    ...execute this command.

答案 1 :(得分:1)

你可以试试下面的sed命令,

$ sed 's~\(<user username="user1" password="\)[^"]*~\1NEWPASS~g' file
<user username="user1" password="NEWPASS" roles="tomcat"/>

答案 2 :(得分:0)

据推测,您只想对包含username="user1"的行执行此操作。所以,你可以做到

sed -i '/username="user1"/{s/password="[^"]*"/password="NEWPASS"/}

我们的想法是找到包含username="user1"的任何行,并仅在这些行上运行脚本。这是通过/foo/{...}语法实现的。然后,通过在"之后查找最长的非password="并用新版本替换整个内容来识别密码。

不需要g,这使得sed替换任何单行中出现的所有内容都是不必要的。

答案 3 :(得分:0)

少即是多。用1

替换g
sed -i s/tomcat/NEWPASS/1 tomcat-users.xml