Bash
將文件內容插入 XML 屬性
我有一個名為的文本文件
branch.txt
:$ cat branch.txt DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970
使用上面的分支名稱,我必須使用
sed
命令查找和替換一些值:branch_name=`(cat /tmp/branch.txt)` sed -i "s/deploy_branch/$branch_name/g" /tmp/input.file
當我執行
sed
命令時,我收到如下錯誤:sed: -e expression #1, char 35: unterminated `s' command
預期輸出:
<Project description="first-deployment" name="DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970 " overwrite="true" type="Repository"> </Project>
輸入文件:
<Project description="first-deployment" name="deploy_branch" overwrite="true" type="Repository"> </Project>
您的
sed
命令的問題是$branch_name
包含嵌入的換行符。sed
當您將替換命令注入sed
編輯表達式時,這會破壞替換命令的語法。用於將文件根節點的屬性
xmlstarlet
更新為文件內容,每個換行符由空格替換:name``Project``branch.txt
xmlstarlet edit \ --update '/Project/@name' \ --value "$(paste -s -d ' ' branch.txt)" input.file
或者,更短,
xmlstarlet ed \ -u '/Project/@name' \ -v "$(paste -s -d ' ' branch.txt)" input.file
paste
命令替換中的命令讀取文件branch.txt
並用空格字元替換除最後一個換行符之外的每個換行符。這會產生一個字元串用作name
屬性的新值。如果要保留最後的換行符並將其轉換為尾隨空格(如您預期的輸出中所示),請使用tr '\n' ' ' <branch.txt
代替paste
命令。該
xmlstarlet
實用程序使用其ed
子命令呼叫。此命令編輯XML 文件,我們指定希望通過匹配屬性的 XPath 查詢更新特定元素。
name
僅當屬性的值為時才需要進行更改deploy_branch
,然後使用 XPath 查詢/Project/@name[. = "deploy_branch"]
或/Project[@name = "deploy_branch"]/@name
代替。上述命令的輸出將是
<?xml version="1.0"?> <Project description="first-deployment" name="DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970" overwrite="true" type="Repository"> </Project>
如果您在或之後為其提供( ) 選項,
xmlstarlet
則可以使該工具進行就地編輯。您可以避免使用( )添加聲明。--inplace``-L``ed``edit``<?xml ...>``--omit-decl``-O