Linux
使用缺少“s”的變數中的 sed 值替換 xml 文件中的值
嗨,有人可以幫我嗎?我正在嘗試使用 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"/>
編輯 XML
sed
很容易失敗。請改用 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'