2014-09-29 177 views
1

要在以下行更改Tomcat密碼SED正則表達式查詢

<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

'/ NeronLeVelu 2014-09-29 14:04:29

回答

1

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

$ sed 's~\(<user username="user1" password="\)[^"]*~\1NEWPASS~g' file 
<user username="user1" password="NEWPASS" roles="tomcat"/> 
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. 
+0

非常好的解釋,但不幸的是第二個命令不起作用。char 22:命令後的額外字符 – user3809938 2014-09-29 14:00:13

+0

這很奇怪,它適用於我。你有哪個版本的sed?如果我運行'sed --version',我會得到'GNU sed version 4.2.1'。 – 2014-09-29 14:03:32

0

想必,你只需要對包含username="user1"行做到這一點。所以,你可以做

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

的想法是找到包含username="user1",只有在那些運行腳本的行。這是通過/foo/{...}語法實現的。然後,通過在password="之後查找最長的非"來識別密碼,並用新版本替換整個事物。

沒有必要使用g,這使sed在任何一行代替所有的事件,在這裏是不必要的。

0

少即是多。將g替換爲1

sed -i s/tomcat/NEWPASS/1 tomcat-users.xml