如何从 Unix 命令行删除 XML 标签?
我正在 grep 一个 XML 文件,它给出如下输出:
<tag>data</tag>
<tag>more data</tag>
...
注意,这是一个平面文件,而不是 XML 树。我想删除 XML 标签并只显示其间的数据。我正在从命令行执行所有这些操作,并且想知道是否有比将其通过管道传输到 awk 两次更好的方法...
cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'
理想情况下,我想在一个命令中执行此操作
I am grepping an XML File, which gives me output like this:
<tag>data</tag>
<tag>more data</tag>
...
Note, this is a flat file, not an XML tree. I want to remove the XML tags and just display the data in between. I'm doing all this from the command line and was wondering if there is a better way than piping it into awk twice...
cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'
Ideally, I would like to do this in one command
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果您的文件看起来像这样,那么
sed
可以帮助您:当然 你不应该使用正则表达式来解析 XML 因为它很难< /a>.
If your file looks just like that, then
sed
can help you:Of course you should not use regular expressions for parsing XML because it's hard.
使用 awk:
Using awk:
尝试一下:
说明:
使用 Perl 兼容的正则表达式 (
-P
) 并仅输出指定的匹配项 (-o
):<.*?> ;
- 尖括号内任何字符的非贪婪匹配\K
- 不在输出中包含前面的匹配(重置匹配开始 - 类似于正向后向查找,但它适用于可变长度匹配).*?
- 非贪婪匹配在下一个匹配处停止(这部分将被输出)(?=<.*?>) - 尖括号内的任何字符的非贪婪匹配,并且不在输出中包含匹配(正向前视 - 适用于可变长度匹配)
Give this a try:
Explanation:
Using Perl Compatible Regular Expressions (
-P
) and outputting only the specified matches (-o
):<.*?>
- Non-greedy match of any characters within angle brackets\K
- Don't include the preceding match in the output (reset match start - similar to positive look-behind, but it works with variable-length matches).*?
- Non-greedy match stopping at the next match (this part will be output)(?=<.*?>)
- Non-greedy match of any characters within angle brackets and don't include the match in the output (positive look-ahead - works with variable-length matches)使用
html2text
命令行工具,将 html 转换为纯文本。或者,您可以尝试ex-way:
或:
Use
html2text
command-line tool, which converts html into plain text.Alternatively you may try ex-way:
or:
我知道这不是一场“pergolf大赛”,但我曾经使用过这个技巧。
将记录分隔符设置为
<
或>
,然后仅打印奇数行:I know this is not a "perlgolf contest", but I used to use this trick.
Set Record Separator for
<
or>
, then print only odd lines: