要更改以下行中的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"/>
答案 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
替换gsed -i s/tomcat/NEWPASS/1 tomcat-users.xml