Sed

使用 sed 查找和替換複雜字元串(最好使用正則表達式)

  • January 12, 2022

我有一個包含以下內容的文件:

<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/之前的告訴ssed 僅適用於包含字元串“使用者名”的行。

引用自:https://unix.stackexchange.com/questions/78625