Grep
如何使用 bash、grep 或 sed 從文件中獲取第一個正則表達式結果?
我有一個名為的文件
index.html
,我grep '<td class="headerCovTableEntryLo">' index.html
得到了這個:<td class="headerCovTableEntryLo">39.2 %</td> <td class="headerCovTableEntryLo">56.6 %</td>
我只需要得到 39.2。我怎樣才能做到這一點?
您可以使用 XML 解析器來解析 HTML,例如
xmlstarlet
.xmlstarlet fo -H page.html | xmlstarlet sel -t -v '//td[@class="headerCovTableEntryLo"][1]' -n 2>/dev/null | tr -dc '[:digit:].\n'
輸出
39.2
第一次呼叫
xmlstarlet
解析 HTML 並儘可能將其轉換為 XML。第二次呼叫解析該 XML 並提取具有匹配<td/>
屬性的第一個元素值。final從字元串中刪除空格和百分比字元(實際上,它刪除了除數字、點和換行符之外的所有內容)。class``headerCovTableEntryLo``tr
如果您需要更精確的匹配,則需要使
//...
路徑更具體或發布更多 HTML。如果您想避免呼叫,
tr
您可以返回元素值 upto 但不包括第一個空格(因此39.2 %
將返回為39.2
):xmlstarlet fo -H page.html | xmlstarlet sel -t -v 'substring-before(//td[@class="headerCovTableEntryLo"][1], " ")' -n 2>/dev/null
如果你有 GNU
grep
,你可以使用-P
選項來啟用 Perl 兼容的正則表達式,這給了我們\K
正則表達式命令,意思是“忽略任何匹配到這一點的東西”。結合-m1
在第一個匹配處停止並-o
僅列印該行的匹配部分,您可以執行以下操作:$ grep -m1 -oP '<td class="headerCovTableEntryLo">\K[0-9.]' file 39.2
或者,類似地:
$ grep -m1 -oP '(?<=<td class="headerCovTableEntryLo">)[0-9.]+' file 39.2
或者,使用
awk
:$ awk -F'[> ]' '/<td class="headerCovTableEntryLo">/{print $3; exit}' file 39.2