2014-06-06 14 views
0

我有一個gawk腳本,它在一個變量中累積了一堆HTML,現在應該通過系統命令將它傳遞給lynx。將未過濾的文本傳輸到awk系統命令的stdin

(隨時告訴我AWK是一個糟糕的解決方案... while read LINE;是瘋狂壞(慢),所以這是需要2)

我在AWK試過這樣:

cmd = sprintf("bash -c \'lynx -dump -force_html -stdin <<< \"%s\"\'", html) 
    system (cmd) 

壞想法,雖然簡單的測試用例可以工作,但原始HTML,特殊字符問題和字符串終止問題比比皆是,逃逸中的轉義內轉義只是變得複雜。

lynx可以很好地處理我在stdin上拋出的任何東西,我不能從awk中將它傳遞給標準輸入,而無需通過命令行對它進行管道處理,這似乎是一個難以實現的解決方案。


編輯(添加我的最終目標細節)的情況下,AWK是不是一個好方法:

我想是解析HTML出一個大的文本文件與HTML塊之間的分隔符。我需要將每個HTML塊傳遞給lynx進行格式化並將其轉儲到新的大文本文件中。


實施例的輸入(從另一系統轉儲)​​:

**********URL: http://some/url 
<html> 
<head><title>Any 'ol HTML document</title</head> 
<body> 
<p>With pretty much any character you can imagine at some point</p> 
<p>I'm using lynx to strip off the HTML and give me a nice format</p> 
</body> 
</html> 
**********URL: http://another/url 
<html><head><title>My input file provides a few 100,000 such html documents</title></head> 
<body/></html> 

每個HTML文件應通過lynx -dump被送入。 Lynx可以從文件(例如命名管道或文件是一個選項)或stdin(使用-stdin選項)讀取HTML。

我的輸出是:

**********URL: http://some/url 
    Any 'ol HTML document 

    With pretty much any character you can imagine at some point 
    I'm using lynx to strip off the HTML and give me a nice format 
**********URL: http://another/url 
    My input file provides a few 100,000 such html documents 
+1

http://mywiki.wooledge.org/XyProblem –

+0

唉,如果有在AWK無解,這是一個很好的答案,我會繼續前進。但是awk很大,我是一個相對的初學者,所以我很難確切地知道這個問題。你知道awk足夠好嗎? –

+4

你能詳細說明一堆HTML是什麼,以及你期望用'lynx'做一些樣本輸入/輸出嗎?此外 - 剛剛發現['|&'爲gawk](http://www.gnu.org/software/gawk/manual/html_node/Two_002dway-I_002fO.html#Two_002dway-I_002fO)coprocesses今天([這裏看到] (http://stackoverflow.com/q/24066356/1259917))這似乎是你可以使用的東西。 – n0741337

回答

1

嘗試|& in gawk.,我發現了從here。這可以讓你從gawk發送輸出到另一個命令的stdin作爲協處理器。

+0

我實現了使用lynx解析所有嵌入式HTML文檔的優雅10行gawk腳本(其中一半專用於打開/關閉協處理器),這個提示非常有幫助! –

0

要添加到n0741337的答案,這裏是一個使用gawk coprocesses的例子,在閱讀他的答案後,它從標準輸入需要「aline」,並將其輸入到一個cat coprocess中,並捕獲cat coprocess的輸出並打印它:

printf "aline" | awk ' 
    BEGIN{cmd="cat"} 
    { 
    print $0 |& cmd; 
    close(cmd, "to"); 
    while ((cmd |& getline line) > 0) { 
     print "got", line 
    }; 
    close (cmd); 
    }' 

result: got aline 

的GAWK手冊有一個更廣泛的此功能的討論:http://www.gnu.org/software/gawk/manual/html_node/Two_002dway-I_002fO.html#Two_002dway-I_002fO