grep para par de letras que ocorre duas vezes na mesma palavra

2

Qual seria a expressão correta para encontrar qualquer palavra com um par de letras que ocorrem duas vezes na mesma palavra? Este é o grep que estou usando, mas obviamente não está funcionando:

grep -E '(.{2}).*' input

exemplo de entrada:

tea sea
halal
unix
linux
Mississippi

saída seria:

halal
Mississippi
    
por mike 02.11.2017 / 21:31

3 respostas

2

grep -E '(..).*' input

A expressão é assim:

  NODE                     EXPLANATION
  (                        group and capture to :
    .                        any character except \n
    .                        any character except \n
  )                        end of 
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
                         what was matched by capture 
    
por 02.11.2017 / 21:48
2

O problema é que você combina expressões regulares estendidas com referências posteriores. Mas aqueles foram intencionalmente deixados de fora do padrão. Então use

grep '\(.\{2\}\).*' input

em vez disso. Ou, mais simples e melhor de ler

grep '\(..\).*' input

Editar:

Ao reler sua pergunta, vejo que eu li demais "duas vezes na mesma palavra ". Seus dados de entrada contêm apenas uma palavra por linha, por isso não importa, mas alterarei a pergunta para conter um caso de teste relevante.

Para "duas vezes na mesma palavra", você pode usar

grep '\(..\)[[:alnum:]]*' input

ou em algumas versões de grep com o atalho

grep '\(..\)\w*' input
    
por 02.11.2017 / 22:17
0

POSIXly:

grep '\([[:alpha:]]\{2\}\)[^[:space:]]*'

Saída das linhas que contêm uma sequência de dois caracteres alfabéticos seguida por qualquer quantidade de caracteres que não sejam espaçamentos seguidos pela mesma sequência de caracteres alfabéticos.

Note que POSIX EREs não suportam referências anteriores, apenas BREs, embora algumas grep implementações suportem referências anteriores em EREs, assim como uma extensão.

Adicione a opção -i se quiser que ela corresponda a Meme , por exemplo.

Se você quisesse exibir apenas as palavras correspondentes (uma por linha) em oposição à linha inteira que as contém, isso não poderia ser feito portavelmente com grep . Você poderia usar perl :

perl -Mopen=locale -lne 'print $& while /\S*([[:alpha:]]{2})\S*\S*/g'

Com a implementação GNU de grep , você deve poder fazer o mesmo com:

grep -Eo '\S*([[:alpha:]]{2})\S*\S*'
    
por 04.01.2018 / 12:07

Tags