2013-11-09 160 views
10

我需要使用sed命令從bash腳本中刪除所有標籤。 我試着用這個Sed從html文件中刪除標籤

sed -r 's/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g' $1 

和蒙山這個

sed -r 's/[\<][\/]?[.]*[\/]?[\\]?[\>]//g' $1 

但我還是錯過了什麼,有什麼建議?

+2

這是我最喜歡的關於HTML和正則表達式的答案;-) http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+1

我完美無缺知道它,但這是作業:-( – michste93

+0

我的學校時間很久以前,但我認爲作業並不一定是一個完美的答案,它也是要表現出一些努力,並有勇氣說,那就是所有我想出來的。:-) –

回答

40

您可以使用許多HTML to text converters之一,使用Perl的正則表達式,如果可能的<.+?>或者如果它必須是sed使用<[^>]*>

sed -e 's/<[^>]*>//g' file.html 

如果沒有空間錯誤,請使用HTML解析器來代替。 例如當一個元素分爲兩行時

<div 
>Lorem ipsum</div> 

這個正則表達式不起作用。


這個正則表達式包括三個部分<[^>]*>

  • 搜索開口<
  • 後跟零個或多個字符*,這是不閉合>
    [...]是一個character class,當它以^開頭時尋找字符在類
  • 終於尋找關閉>

更簡單的正則表達式<.*>將無法​​正常工作,因爲它搜索最長可能的匹配,即在輸入行的最後收盤>。例如,當您在輸入行有一個以上的標籤

<name>Olaf</name> answers questions. 

將導致

回答問題。

,而不是

奧拉夫回答問題。

另請參閱Repetition with Star and Plus,特別是章節Watch Out for The Greediness!及以下,爲詳細解釋。

+0

工程就像一個魅力..雖然我吸吮sed,所以你可以請解釋<[^>] *>位? –

+0

'[^>]'是一個匹配任何字符的字符類,除了'>'和'*'表示重複匹配零次或多次。否則,'<.*>'將從第一個'<'到最後一個'>'匹配,通常跨越多個標籤。 – tripleee