Sed
使用 sed 查找和替換複雜字元串(最好使用正則表達式)
我有一個包含以下內容的文件:
<username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname>
我需要製作一個腳本,將第一行中的“名稱”更改為“某物”,將第二行中的“密碼”更改為“某事”,將第三行中的“名稱”更改為“某事不同”。我不能依賴這些在文件中出現的順序,所以我不能簡單地將“name”的第一次出現替換為“something”,將“name”的第二次出現替換為“somethingdifferent”。我實際上需要搜尋周圍的字元串,以確保我找到並替換了正確的東西。
到目前為止,我已嘗試使用此命令查找並替換第一個“名稱”出現:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
但是它不起作用,所以我認為其中一些角色可能需要轉義,等等。
理想情況下,我希望能夠使用正則表達式來匹配兩個“使用者名”事件並僅替換“名稱”。像這樣的東西,但有
sed
:<username>.+?(name).+?</username>
並將括號中的內容替換為“某物”。
這可能嗎?
sed -i -E "s/(<username>.+)name(.+<\/username>)/\1something\2/" file.xml
我想,這就是你要找的東西。
解釋:
- 第一部分中的括號定義了可以在第二部分中重用的組(實際上是字元串)
\1
第二部分中的,\2
等是對第一部分中擷取的第 i 個組的引用(編號從 1 開始)-E
啟用擴展正則表達式(需要+
和分組)。-i
啟用“就地”文件編輯模式
sed -e '/username/s/CDATA\[name\]/CDATA\[something\]/' \ -e '/password/s/CDATA\[password\]/CDATA\[somethingelse\]/' \ -e '/dbname/s/CDATA\[name\]/CDATA\[somethingdifferent\]/' file.txt
/username/
之前的告訴s
sed 僅適用於包含字元串“使用者名”的行。