Sed

Unix 的擴展正則表達式是否兼容?

  • February 23, 2018

Unix 的工具正則表達式完全兼容嗎?

例如,如果我grep -oE "\$text *\( *([^)]) *\)",如果我使用,我是否保證替換我得到的確切部分sed -E "s/\$text *\( *([^)]) *\)/replacement/g"?這擴展到所有正則表達式?

這些匹配(或不匹配)到什麼程度?

在旁注中,我的 man sed 沒有顯示-E開關 - 但仍然有效,並告訴我正則表達式開關是-r. 是-E-r 同一件事嗎?

GNU grep 和 GNU sed 的手冊都提到-E了使用擴展正則表達式的選項:

抓地力

-E --extended-regexp

將模式解釋為擴展正則表達式 (ERE)。(-E 由 POSIX 指定。)

但是

-E -r --regexp-extended

使用擴展正則表達式而不是基本正則表達式。

(還有一個提到-E被支持但之前沒有記錄。)

您可以檢查兩者支持的正則表達式的確切定義,但您的正則表達式看起來足夠標準。事實上,它看起來等同於基本的正則表達式\$text *( *[^)] *)(除非您的sed替換使用擷取組)。

但是,請注意,如所寫(用雙引號括起來),它不會匹配任何內容。反斜杠將轉義 shell 的美元符號,防止它被視為參數擴展。但是grepor會看到一個以for end of linesed開頭的正則表達式。$行尾後不能有任何內容,因此模式無法匹配。您需要再添加兩個反斜杠,或者使用單引號而不是雙引號。

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