我有一个看起来像这样的xml文件,我想从里面删除所有的<meta> 标签:
<xml>
<note>
<to>A</to>
<from>B</from>
<meta>
junk
</meta>
<meta>
more junk
</meta>
<body>
keep this
</body>
</note>
...
</xml>
sed 工具很快就完成了这项工作。
需要注意的是。该文件的格式已经很好,而这些meta 标签跨越了多行。
如果你的文件是乱七八糟的,你可能想先用更漂亮的格式化它。
用sed等工具来操作XML或HTML通常不是一个好主意。对于一个能够处理所有有效的XML语法的通用解决方案,你需要一个适当的XML解析器。但如果你的文件是正确的,sed可以是一个快速和肮脏的方式来完成工作。
这是我运行的命令:
sed -i '' -e '/<meta>/,/<\/meta>/d' my-file.xml
-i 意思是 "就地"。它将改变磁盘上的文件。'' 是备份文件的名称--在这种情况下,没有。不过,Mac版的sed 需要这个名字。如果你是在其他系统上,你可能不需要这个。
-e 说要执行后面的正则表达式。
让我们来分解一下这个表达式。/<meta>/,/<\/meta>/d
中间的逗号告诉 sed 寻找一个行的范围,在逗号的两边是一个正则表达式。结尾处的d 意味着 "删除这个范围"。阅读sed中关于范围的内容,你可以用它们做更多的事情。
所以我们要找的是以<meta> 开始,以</meta> 结束的行,斜线需要在第二个重码中被转义,所以我们有/<\/meta>/ 。