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 个字符
  • .*将匹配之间的任何内容

相关内容