Cygwin - egrep 指令從給定的文字檔中尋找模式

Cygwin - egrep 指令從給定的文字檔中尋找模式

我被要求找到以長度為 3 的子字串開頭的單字集,其中包含字元 a、b 和 c,並且還包含另一個包含相同 3 個字元的不相交子字串

前任。 abcacb abcbac

幫我找一個正規表達式。謝謝

編輯: abcbac - a、b、c 應該作為前 3 個字母,然後 a、b、c 應該更改前 3 個字母的順序。只有 6 個字串。

acbbca abccba bacbca 等等......

答案1

(此處的解決方案假設grep使用 PCRE 支援建構 GNU(通常是 cygwin 上的情況))。

你的要求的前半部分意味著。

grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'

或者可能:

grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'

後半部似乎與前半部相矛盾:

grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'

會發現單字在本例中被定義為字元序列),以由,和(每個字元一個)[a-zA-Z0-9_]組成的 3 個字元的序列開頭,但後面跟著另一個這樣的序列(指與第一組中相同的正規表示式),前提是它是與第一個不同(指與第一個捕獲組匹配的字串,並且是abc(?1)(...)\1(...)(?!...)消極展望操作員)。

$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
    grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb

答案2

這應該可以做到:

grep -Ew '[a-c]{3}.*[a-c]{3}'
  • -E匹配正規表示式
  • -w僅匹配單字
  • [a-c]{3}將恰好匹配a-c集合中的 3 個字符
  • .*將匹配之間的任何內容

相關內容