Como faço para grep para palavras com um número exato de ocorrências de uma letra?

0

Estou tentando escrever um script que pesquise um dicionário por palavras que contenham exatamente duas ocorrências de cada letra. Eu simplesmente não faço a sintaxe para grep exatamente por duas ocorrências de uma letra.

    
por plshelp 10.04.2018 / 16:55

1 resposta

3

Se você quiser encontrar exatamente duas instâncias em qualquer lugar em uma palavra, será necessário permitir sequências arbitrárias não correspondentes antes, entre e depois dos caracteres correspondentes.

por exemplo. para encontrar palavras inteiras que consistem em exatamente 2 instâncias da letra q , sem diferenciação de maiúsculas e minúsculas, em /usr/share/dict/words :

$ grep -wi '[^q]*q[^q]*q[^q]*' /usr/share/dict/words
Albuquerque
Albuquerque's
Qiqihar
Qiqihar's

Se você não estiver limitado a grep especificamente, convém considerar o uso de perl , onde é possível usar o fato de que, quando avaliado em um contexto escalar, o comando tr retorna o número de transliterações, por exemplo,

perl -ne 'print if tr/qQ/qQ/ == 2' /usr/share/dict/words

Em uma veia similar, com o GNU awk, você poderia definir o caractere de interesse como o padrão de campo e testar o número de campos:

gawk -vFPAT='[qQ]' 'NF==2' /usr/share/dict/words
    
por steeldriver 10.04.2018 / 17:09