(Soluções aqui assumindo o GNU grep
quando construído com suporte a PCRE (como é tipicamente o caso no cygwin)).
A primeira metade de seus requisitos significaria.
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
Ou possivelmente:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\w*'
Para o segundo semestre que parece contradizer o primeiro semestre:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!)(?1)'
Encontraria as palavras ( palavra sendo definida como uma seqüência de [a-zA-Z0-9_]
caracteres neste caso) que começam com uma sequência de 3 caracteres composta por a
, b
e c
(um de cada) seguido por outra dessas sequências ( (?1)
referindo-se ao mesmo regexp que no primeiro grupo (...)
), desde que não seja igual ao primeiro ( refere-se à cadeia que foi correspondida pelo primeiro grupo de captura
(...)
e (?!...)
é um operador negativo antecipado ).
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!)(?1)'
abcbca
abcacb