将文件内容插入 XML 属性

将文件内容插入 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>

答案1

您的命令的问题sed$branch_name包含嵌入的换行符。sed当您将替换命令插入编辑表达式时,这会破坏替换命令的语法sed


用于将文档根节点的属性xmlstarlet更新为文件的内容,并将每个换行符替换为空格:nameProjectbranch.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.txtin 代替该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-Lededit<?xml ...>--omit-decl-O

相关内容