Linux

使用缺少“s”的變數中的 sed 值替換 xml 文件中的值

  • February 13, 2022

嗨,有人可以幫我嗎?我正在嘗試使用 sed 命令替換 tomcat server.xml 文件使用者名中的值

<Resource username="user1" password="xxxxxxxx"/>

下面的命令按預期替換值,但在值周圍缺少“”,因為我從變數 U 中獲取值。

export U="userx"
sed -i -E  's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g' server.xml

userx 周圍的輸出缺少“”: <Resource username=userx password="xxxxxxxx"/>

如果我使用值而不是變數,它也可以與“”一起使用

sed -i -E  's/(username=)([a-zA-Z0-9"-])+/\1"userx"/g' server.xml

ouput: <Resource username="userx" password="xxxxxxxx"/>

編輯 XMLsed很容易失敗。請改用 XML 編輯工具。例如,xmlstarlet它變得微不足道

U='userx'
xmlstarlet edit --inplace --update '//Resource/@username' --value "$U" server.xml

--inplace就個人而言,在我完成替換工作的測試之前,我不會使用。

xmlstarlet通常可以從您的發行版的包管理器中獲得。如果您沒有它並且無權安裝它,請向您的變更委員會送出請求以執行此操作。這是關於使用正確的工具來完成正確的工作。


順便說一句,您的sed命令不起作用的原因是它從未看到您想要包含的雙引號。這是帶有一些註釋的原始命令

sed -E 's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g'
       ^single quotes start             ^single quotes end
                                         ^double quotes start
                                            ^double quotes end

shell 使用引號來標識如何解析字元串(或不解析)。單引號提供字元的文字序列。雙引號保護大多數字元,但特別允許評估變數。*命令(sed在這種情況下)永遠不會看到這些外部引號。*因此,要在字元串中包含雙引號,您需要引用它們。

為了可讀性而不是語法準確性,我在引號處拆分了更正的單個表達式

sed -E 's/(username=")([a-zA-Z0-9-])+/\1' "$U" '"/g'
      ^literal text used as an RE
                                         ^variable (quoted to protect it from the shell)
                                              ^more literal text

再次將其放在一起,以便sed看到單個表達式字元串,

sed -E 's/(username=")([a-zA-Z0-9-])+/\1'"$U"'"/g'

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