我有一个名为的文本文件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
更新为文件的内容,并将每个换行符替换为空格: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
in 代替该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