2

我有一个 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 

非常感谢小伙伴们,谢谢!

4

4 回答 4

4

掌握树枝工具。它拥有的东西之一是一个叫做xml_grep. 你的问题减少到

cat foo.txt | xml_grep --nowrap pre 

pre是一个xpath表达式。随后进行一些简单的文本处理,即使您的 XML 格式不同,这也将起作用。

忠告 - 不要使用 sed 和其他基于流的文本处理工具来操作 XML 等结构化数据。使用适当的解析器。

于 2010-05-24T17:29:24.683 回答
2

如果您有 XHTML,则使用xmlstarlet。如果你不那么先通过 HTML Tidy,然后把它变成 XHTML。

于 2010-05-24T17:06:26.180 回答
2

由于您特别询问了使用 sed 的解决方案...假设有趣的行总是在包含<pre>and的行之间</pre>(看起来完全一样),并且有趣的内容永远不会与开始或结束标记在同一行,并假设第一个这样的块是您唯一要提取的块,并且假设虽然您了解这确实是解决此问题的错误方法,但您仍然想这样做,那么您可以使用 sed 来执行此操作,例如像这样:

sed '1,/<pre>/d;/<\/pre>/,$d'

它删除从第一行到包含的<pre>所有行以及从包含</pre>到最后的所有行。

(FWIW,我宁愿使用 XPath 表达式来选择有趣的内容。例如,使用Ignacio Vazquez-Abrams 建议的xmlstarlet可以这样:xmlstarlet sel -t -v /html/body/pre。)

于 2010-05-24T20:52:16.410 回答
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
于 2010-05-24T17:14:33.413 回答