在下面的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>
答案 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代码,在我们的情况下是模式匹配和替换。如果您要查找并替换多个文件,则可以将其与find
和xargs
配对,例如
find ~/mystuff -name "*.txt" | xargs perl -i -0pe 's/regex/replacement/g'