如何从Unix命令行中删除XML标签?

时间:2011-03-21 09:56:05

标签: xml shell unix command-line xml-parsing

我正在使用XML文件,它给出了这样的输出:

<tag>data</tag>
<tag>more data</tag>
...

注意,这是一个平面文件,而不是XML树。我想删除XML标记,只显示其间的数据。我是从命令行做的所有这些,并且想知道是否有更好的方法而不是将它输入awk两次...

cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'

理想情况下,我想在一个命令中执行此操作

5 个答案:

答案 0 :(得分:35)

如果您的文件看起来像那样,那么sed可以帮助您:

sed -e 's/<[^>]*>//g' file.xml

当然you should not use regular expressions for parsing XML because it's hard

答案 1 :(得分:4)

使用awk:

awk '{gsub(/<[^>]*>/,"")};1' file.xml

答案 2 :(得分:1)

尝试一下:

grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile

说明:

使用Perl兼容的正则表达式(-P)并仅输出指定的匹配项(-o):

  • <.*?> - 尖括号内任意字符的非贪婪匹配
  • \K - 不要在输出中包含前面的匹配(重置匹配开始 - 类似于正面后视,但它适用于可变长度匹配)
  • .*? - 非贪婪的比赛在下一场比赛中停止(此部分将被输出)
  • (?=<.*?>) - 尖括号内任意字符的非贪婪匹配,不包括输出中的匹配(正向预测 - 适用于可变长度匹配)

答案 3 :(得分:1)

使用html2text命令行工具,将html转换为纯文本。

或者您可以尝试ex - 方式:

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt

或:

cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin

答案 4 :(得分:0)

我知道这不是“perlgolf竞赛”,但我曾经使用过这个技巧。

<>设置记录分隔符,然后只打印奇数行:

awk -vRS='<|>' NR%2 file.xml