通过匹配标记值来删除xml中的前/后行

时间:2018-09-14 07:58:35

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

在下面的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>

我需要通过匹配上述XML文件中工件ID(即“ 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>

1 个答案:

答案 0 :(得分:0)

这需要多行搜索和替换操作,例如使用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进入“文件扫描”模式,即整个输入文件被读取为一个而不是逐行读取。这样可以进行多行搜索和替换。
  • -pe使我们可以直接运行Perl代码,在我们的情况下是模式匹配和替换。

如果您要查找并替换多个文件,则可以将其与findxargs配对,例如

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