Bash

將文件內容插入 XML 屬性

  • October 7, 2022

我有一個名為的文本文件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

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