我正在寫一個分析HTML文件的bash腳本,並且我想要獲取每個單獨的內容<tr>...</tr>
。所以我的命令看起來像:非貪婪匹配使用?與grep
$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'
但似乎grep
給我的結果:
$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>'
我怎樣才能讓.*
非貪婪?
我正在寫一個分析HTML文件的bash腳本,並且我想要獲取每個單獨的內容<tr>...</tr>
。所以我的命令看起來像:非貪婪匹配使用?與grep
$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'
但似乎grep
給我的結果:
$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>'
我怎樣才能讓.*
非貪婪?
如果你有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>
與嵌套標籤的工作。
最後一個示例(使用「[^ <] *「不太可能工作,因爲在」tr「中不可避免地會出現」td「或」th「標籤 –
@glennjackman好點,但我會留下它的答案,因爲一般原則可能對觀看者有用 –
.*?
是一個Perl正則表達式。更改grep
到
grep -oP '<tr>.*?</tr>'
或者,如果他只想要tr標籤的內容:'grep -oP'(?<=
嘗試的Perl風格的正則表達式
$ grep -Po '<tr>.*?</tr>' input
<tr>stuff</tr>
<tr>more stuff</tr>
非貪婪匹配是不grep -E
支持擴展正則表達式語法的一部分。如果你有,請使用grep -P
,或者切換到Perl/Python/Ruby /你有什麼。 (哦,和pcregrep
。)
必須:[您不能使用正則表達式解析html](http://stackoverflow.com/a/1732454/7552) –