使用 sed 替换 xml 标签

dat*_*tax 3 xml bash sed jenkins

我们有一个 jenkins 服务器,其中有太多作业,并且大多数作业都将 Build 触发器作为 Poll SCM。我想删除所有作业的触发器。寻找一种简单的方法来做到这一点。我看到每当设置构建触发器属性时,config.xml 都会有这个 -

<triggers>
    <hudson.triggers.SCMTrigger>
      <spec>
        # poll infrequently and rely on Stash webhooks to trigger builds
        @daily
      </spec>
      <ignorePostCommitHooks>false</ignorePostCommitHooks>
    </hudson.triggers.SCMTrigger>
</triggers>
Run Code Online (Sandbox Code Playgroud)

每当 Poll SCM 标志设置为 false 时,config.xml 中的相同元素如下-

 <triggers/>
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种使用 sed 替换上述触发器标记的简单方法,但无法使用 sed 获取它。

我从作业文件夹中尝试了这个,但它不起作用-

sudo find . -name "config.xml" -print0 | sudo xargs -0 sed -i '' -e 's|<triggers>.*<\/triggers|<triggers\/>|g'
Run Code Online (Sandbox Code Playgroud)

所以基本上我想用这个替换上面的触发器元素的全部内容以及开始和结束触发器标签

<triggers/>
Run Code Online (Sandbox Code Playgroud)

Lev*_*sky 5

sed是一个流编辑器,逐行读取文件。您的模式跨越文件中的多行,这就是它从不匹配的原因。

您应该sed在尝试替换之前将整个文件读入模式空间...

sed ':a;N;$!ba; s|<triggers>.*<\/triggers>|<triggers\/>|g' example.xml
Run Code Online (Sandbox Code Playgroud)

... 或使用其他工具(最好适用于 XML 文件,例如xmlstarlet):

xmlstarlet ed -O -u /triggers -v '' example.xml
Run Code Online (Sandbox Code Playgroud)