首页 > 解决方案 > 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>

标签: xmlbashshellsed

解决方案


使用这个有效的 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


推荐阅读