2010-05-24 24 views
2

我有一個HTML文件,我對<pre> </pre>標籤所包含的數據感興趣。有沒有可以做到這一點的單線程?UNIX解析HTML頁面顯示標籤的內容 - 一個班輪?

示例文件:

<html> 
<title> 
Hello There! 
</title> 
<body> 
<pre> 
John Working 
Kathy Working 
Mary Working 
Kim N/A 
</pre> 
</body> 
</html> 

輸出應該是:

John 
Kathy 
Mary 
Kim 

非常感謝你們,謝謝!

回答

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 
+0

真棒,它的作品!出於好奇,我們可以用'sed'來實現嗎? sed -n'/pre/ ='file.txt(獲取行號) - > sed -n '76,216p'file.txt(從上面的sed中獲取的打印行)。如何將它們整合在一起? – ThinkCode 2010-05-24 17:25:16

2

如果您有XHTML,然後使用xmlstarlet。如果您沒有先通過HTML Tidy,並將其轉換爲XHTML。

+0

有沒有用「的sed」的解決方案?謝謝.. – ThinkCode 2010-05-24 17:07:53

4

讓您的雙手上twig tools。其中的一件事就是xml_grep。你的問題減少到

cat foo.txt | xml_grep --nowrap pre 

prexpath表達。 接下來是一些簡單的文本處理,即使您的XML格式不同,這也可以工作。

建議的意思 - 不要使用sed和其他基於流的文本處理工具來操縱XML等結構化數據。使用合適的解析器。

+1

聽起來像一個偉大的工具。我不知道如何安裝,我不想問我的管理員爲我安裝它們,尋找快速簡單的事情來完成我的任務。一個雖然:) – ThinkCode 2010-05-24 17:42:39

+0

謝謝。儘管警告。如果您的輸入稍有變化,則基於原始文本的XML解析將會中斷。 – 2010-05-28 10:11:37

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

+0

我也喜歡你的解決方案,謝謝! – ThinkCode 2010-05-25 01:03:49