我正在使用XML文件,它给出了这样的输出:
<tag>data</tag>
<tag>more data</tag>
...
注意,这是一个平面文件,而不是XML树。我想删除XML标记,只显示其间的数据。我是从命令行做的所有这些,并且想知道是否有更好的方法而不是将它输入awk两次...
cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'
理想情况下,我想在一个命令中执行此操作
答案 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