2013-10-01 119 views
7

我正在寫一個分析HTML文件的bash腳本,並且我想要獲取每個單獨的內容<tr>...</tr>。所以我的命令看起來像:非貪婪匹配使用?與grep

$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>' 

但似乎grep給我的結果:

$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>' 

我怎樣才能讓.*非貪婪?

+2

必須:[您不能使用正則表達式解析html](http://stackoverflow.com/a/1732454/7552) –

回答

14

如果你有GNU Grep你可以使用-P進行匹配非貪婪:

$ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>' 

-P選項啓用的Perl兼容正則表達式(PCRE)這是需要非貪婪匹配與?作爲基本正則表達式(BRE)和擴展正則表達式(ERE)不支持它。

如果您正在使用-P你也可以使用look arounds,以避免打印標籤在比賽中像這樣:

$ tr -d \\012 < price.html | grep -Po '(?<=<tr>).*?(?=</tr>)' 

如果你沒有GNU grep和HTML很好地形成你可以只是做:

$ tr -d \\012 < price.html | grep -o '<tr>[^<]*</tr>' 

注:以上例子不會內<tr>與嵌套標籤的工作。

+3

最後一個示例(使用「[^ <] *「不太可能工作,因爲在」tr「中不可避免地會出現」td「或」th「標籤 –

+1

@glennjackman好點,但我會留下它的答案,因爲一般原則可能對觀看者有用 –

3

.*?是一個Perl正則表達式。更改grep

grep -oP '<tr>.*?</tr>' 
+1

或者,如果他只想要tr標籤的內容:'grep -oP'(?<=)。*?(?=?)'' - 使用環視來省略實際的標籤 –

3

嘗試的Perl風格的正則表達式

$ grep -Po '<tr>.*?</tr>' input 
<tr>stuff</tr> 
<tr>more stuff</tr> 
4

非貪婪匹配是不grep -E支持擴展正則表達式語法的一部分。如果你有,請使用grep -P,或者切換到Perl/Python/Ruby /你有什麼。 (哦,和pcregrep。)