Cygwin - comando egrep para encontrar padrões de um determinado arquivo de texto

Cygwin - comando egrep para encontrar padrões de um determinado arquivo de texto

Pediram-me para encontrar o conjunto de palavras que começam com uma substring de comprimento 3 contendo os caracteres a, b e c e que contém adicionalmente outra substring disjunta contendo os mesmos 3 caracteres

ex. abcacb acbbac

me ajude a encontrar um regex para isso. Obrigado

editar: abcbac - a,b,c deve estar lá como as 3 primeiras letras, então a,b,c deve mudar sua ordem das 3 letras anteriores. apenas 6 sequências de caracteres.

acbbca abcba bacbca etc....

Responder1

(As soluções aqui assumem GNU grepquando construídas com suporte PCRE (como normalmente é 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*\1\w*'

Para o segundo tempo isso parece contradizer o primeiro tempo:

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

Encontraria opalavras(palavrasendo definido como uma sequência de [a-zA-Z0-9_]caracteres neste caso) que começam com uma sequência de 3 caracteres composta por a, be c(um de cada) seguido por outra dessas sequências ( (?1)referindo-se ao mesmo regexp do primeiro (...)grupo) desde que seja não é o mesmo que o primeiro ( \1refere-se à string que foi correspondida pelo primeiro (...)grupo de captura e (?!...)é umolhar negativo para frenteoperador).

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

Responder2

Isso deve servir :

grep -Ew '[a-c]{3}.*[a-c]{3}'
  • -Epara corresponder às expressões regulares
  • -wpara combinar apenas palavras
  • [a-c]{3}corresponderá exatamente a 3 caracteres do a-cconjunto
  • .*corresponderá a qualquer coisa entre

informação relacionada