Grep

如何使用 bash、grep 或 sed 從文件中獲取第一個正則表達式結果?

  • May 13, 2021

我有一個名為的文件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

引用自:https://unix.stackexchange.com/questions/649510