Grep

帶有正則表達式的 grep 找不到匹配項

  • February 14, 2022

數字不能以 0 開頭。

我用 reg ex 執行了這個 grep 命令

❯ echo "#time 1m" | grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

並獲得以下輸出:

zsh: event not found: 0

我在圖形 reg ext 測試器中的嘗試顯示了一個匹配項:在此處輸入圖像描述

zsh: event not found: 0

這是由於 shell 將!視為歷史擴展的觸發器。將字元串放在單引號中,或者使用set +o histexpand(或setopt nohistexpand在 zsh 或set +HBash 中)禁用歷史擴展。請參閱例如了解 bash 中的驚嘆號 (!)

... grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

請注意\s(?!...), 和\d是 Perl 正則表達式的一部分,而不是grep -E使用的標準擴展正則表達式。此外,[m|h|d]匹配任何單個字元,它是m|hd. 最好寫成[mhd|]這樣,但你可能是說[mhd](或者(m|h|d)這只是一種更長的寫法)。

您可能必須將正則表達式重寫為標準 ERE,或者切換到可以使用 Perl 正則表達式的工具,例如grep -PGNU grep。

請參閱為什麼我的正則表達式在 X 中有效但在 Y 中無效?

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