xml - SED 多行搜索和替换错误
问题描述
我有一个如下的 XML 文件(config.xml)。
<?xml version="1.1" encoding="UTF-8"?>
<project>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<com.cloudbees.jenkins.GitHubPushTrigger plugin="github@1.29.2">
<spec/>
</com.cloudbees.jenkins.GitHubPushTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
</project>
我想用 only 替换 triggers 块<triggers/>
。但是当我使用 SED 执行此操作时,我收到此错误:
sed: 1: "/<triggers>/{:a;N;/<\/t ...": unexpected EOF (pending }'s)
命令:
sed -i '.bak' '/<triggers>/{:a;N;/<\/triggers>/!ba;N;s/.*\n/<triggers\/>\n/};p' config.yml
我想让你知道我在这里缺少什么以及如何获得预期的结果?
期望的输出:
<?xml version="1.1" encoding="UTF-8"?>
<project>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
</triggers>
<concurrentBuild>false</concurrentBuild>
</project>
解决方案
使用这个有效的 XML 文件:
<?xml version="1.0"?>
<root>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<com.cloudbees.jenkins.GitHubPushTrigger plugin="github@1.29.2">
<spec/>
</com.cloudbees.jenkins.GitHubPushTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
</root>
使用此命令:
xmlstarlet edit --omit-decl --update "//triggers" --value ""
输出:
<root>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
</root>
如果要就地编辑文件,请添加选项 -L。
看:xmlstarlet edit --help
推荐阅读
- javascript - React-Redux 类组件 mapStateToProps 错误
- ruby - Why will my if and els-if statement within my ruby method not work
- javascript - Adding onclick event to dynamically created buttons in javascript without using library
- excel - 在 Excel 加载项中使用运行和请求上下文的正确方法
- reactjs - Why it is returning me Class extends value #