Grep

如何在 grep 中使用正則表達式(僅限基本正則表達式)實現交替?

  • June 21, 2019

我知道這個問題沒有多大意義,因為我可以使用擴展正則表達式 (ERE)。但是讓我們說一分鐘,實施交替是目前唯一的選擇。我將如何僅使用 BRE 實現它?還是我必須找到解決方法?

假設我們有這個字元串:

AAAAAA======-----======AAAAAAAAA

我現在的目標是僅使用基本正則表達式分別匹配 AAAAA、======、—–、====== 和 AAAAAAAAA。使用 ERE,這將很快完成,但我想知道如何僅通過 BRE 實現它。到目前為止,如果不讓一些匹配的字元串相互重疊,我找不到合適的方法(比如不應該發生的正則表達式匹配“AAAAA==”)。

很簡單: BRE不可能輪換

POSIX BRE 不支持任何其他功能。甚至不支持交替。

你的基本目標:

我現在的目標是匹配……分別……與基本正則表達式。

可以使用 BRE:

$ str='AAAAAA======-----======AAAAAAAAA'
$ echo "$str" | grep -Eo '(.)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

甚至在 BRE grep 中有幾種模式:

$ echo "$str" | grep -o -e 'AA*' -e '--*' -e '==*'
AAAAAA
======
-----
======
AAAAAAAAA

或者將您的解決方案限制為 GNU grep(\|即使在 BRE 語法中也允許作為替代;這不是有效的 POSIX 功能):

$ echo "$str" | grep -o '\(AA*\)\|\(==*\)\|\(--*\)'

但你的次要目標:

是否也可以將它們另外放在單獨的擷取組中?

只需要一個正則表達式,因為在 BRE 中不可能有交替,所以這是不可能的。

關於 BRE 中交替的一個很好的解釋

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