我有一个HTML文件,我对<pre> </pre>
标记所包含的数据感兴趣。有没有可以做到这一点的单线程?
示例文件:
<html>
<title>
Hello There!
</title>
<body>
<pre>
John Working
Kathy Working
Mary Working
Kim N/A
</pre>
</body>
</html>
输出应为:
John
Kathy
Mary
Kim
非常感谢大家,谢谢!
答案 0 :(得分:4)
抓住twig tools。其中一件事叫做xml_grep
。你的问题缩小为
cat foo.txt | xml_grep --nowrap pre
pre
是xpath表达式。
接下来是一些简单的文本处理,即使您的XML格式不同,这也会有效。
建议 - 不要使用sed和其他基于流的文本处理工具来处理像XML这样的结构化数据。使用适当的解析器。
答案 1 :(得分:2)
如果您有XHTML,请使用xmlstarlet。如果你没有,那么先将它传递给HTML Tidy,然后将其转换为XHTML。
答案 2 :(得分:2)
因为您特别询问了使用sed的解决方案...假设有趣的行总是在包含<pre>
和</pre>
的行之间(看起来完全一样)并且有趣的内容永远不会出现与开始或结束标记相同的行,并假设第一个这样的块是您想要提取的唯一一个,并假设虽然您理解这是解决此问题的the wrong way,但您仍然希望这样做它,然后你可以使用sed这样做,例如:
sed '1,/<pre>/d;/<\/pre>/,$d'
删除从第一行到包含<pre>
的所有行以及从包含</pre>
到最后一行的所有行。
(FWIW,我宁愿使用XPath表达式来选择有趣的内容。例如,使用xmlstarlet as suggested by Ignacio Vazquez-Abrams它可以是这样的:xmlstarlet sel -t -v /html/body/pre
。)
答案 3 :(得分:1)
我的Perl-fu很弱,但这适用于你的例子:
$ cat file.html | perl -e'while(<>){if(/<\/pre>/){$a=0;}if($a){print}if(/<pre>/){$a=1;}}' | cut -f1 -d' '
John
Kathy
Mary
Kim