【问题标题】:Delete before/after lines in xml by matching tag value通过匹配标签值删除xml中的前/后行
【发布时间】:2019-02-19 00:00:03
【问题描述】:

在下面截断的 XML 中,我需要删除与工件 ID 值匹配的不需要的行:

    <groupID>com.test</groupID>
    <artifactID>nginx-node</artifactID>
    <verion>1.0</version>
    <groupID>com.test</groupID>
    <artifactID>nginx-node</artifactID>
    <verion>1.1</version>
    <groupID>com.test</groupID>
    <artifactID>nginx</artifactID>
    <verion>1.2</version>

我需要通过匹配工件 ID 的值,即上述 XML 文件中的“nginx-node”,删除当前、之前和之后的所有 XML 行

命令尝试:

grep -iv "nginx-node" file.

实际输出:

 <groupID>com.test</groupID>
    <verion>1.0</version>
    <groupID>com.test</groupID>
    <verion>1.1</version>
    <groupID>com.test</groupID>
    <artifactID>nginx</artifactID>
    <verion>1.2</version
    **Expected output:**
    <groupID>com.test</groupID>
    <artifactID>nginx</artifactID>
    <verion>1.2</version>

【问题讨论】:

  • 你为什么不使用像xpath这样的额外工具

标签: xml shell xml-parsing pom.xml string-matching


【解决方案1】:

这需要多行搜索和替换操作,例如使用 Perl。确实,单线可以完成工作:

perl -i -0pe "s/^\s*\S*\s*<artifactID>nginx-node<\/artifactID>\s*\S*\s*$//gm" input.txt

Online Regex Demo(见右手正则解释)

标志说明:

  • -i 告诉 Perl 执行就地替换,即立即更新输入文件。 (在试运行时忽略此选项)
  • -0 将 Perl 转换为“file slurp”模式,即整个输入文件被一次性读取,而不是逐行读取。这可以实现多行搜索和替换。
  • -pe 可以直接运行 Perl 代码,在我们的例子中是模式匹配和替换。

如果要在多个文件中查找和替换,请将其与findxargs 结合使用,例如

find ~/mystuff -name "*.txt" | xargs perl -i -0pe 's/regex/replacement/g'

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2013-10-22
    • 1970-01-01
    • 2021-03-13
    • 2022-08-17
    相关资源
    最近更新 更多