【问题标题】:Replace xml tag using sed使用 sed 替换 xml 标签
【发布时间】:2017-12-12 07:05:31
【问题描述】:

我们的 jenkins 服务器有太多作业,并且大多数作业都有构建触发器作为轮询 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>

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

 <triggers/>

我正在寻找一种简单的方法,使用 sed 来替换上面的 triggers 标记,但我无法使用 sed 来获取它。

我从工作文件夹中尝试过,但它不起作用-

sudo find . -name "config.xml" -print0 | sudo xargs -0 sed -i '' -e 's|<triggers>.*<\/triggers|<triggers\/>|g'

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

<triggers/>

【问题讨论】:

  • 到目前为止您尝试过的sed 尝试在哪里?
  • 试过这个,但它不起作用 - sudo find 。 -名称“config.xml”-print0 | sudo xargs -0 sed -i '' -e 's|.*|g'
  • 不清楚你到底想改变什么(从 -> 到);也许将其添加到您的问题中。从您的正则表达式模式的外观来看,您似乎想清除触发器标签之间的所有内容并替换为&lt;triggers/&gt;?
  • 还有一个问题,标签之间的行数是否总是一样的?

标签: xml bash jenkins sed


【解决方案1】:

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

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

sed ':a;N;$!ba; s|<triggers>.*<\/triggers>|<triggers\/>|g' example.xml

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

xmlstarlet ed -O -u /triggers -v '' example.xml

【讨论】:

  • sed 示例运行良好。感谢@Lev Levitsky 提出这个建议。这对我来说非常有用,而且很多工作都在瞬间改变。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2017-10-07
  • 2019-05-25
  • 2011-11-03
  • 2015-06-01
  • 1970-01-01
  • 2016-03-13
相关资源
最近更新 更多