Localizando palavras com características particulares em um arquivo de dicionário

0

Pesquise palavras que começam com b e terminam com o e contêm i ou g em um arquivo de texto.

Um comando deve ser digitado no terminal exibindo uma palavra que tenha as especificações descritas acima.

Eu usei o seguinte, mas não para em uma palavra e contém espaços em branco:

~$  egrep -n '\bb.*(i|g).*o\b'

Estou usando o Linux Ubuntu e não sei como fazer a declaração. Eu tentei várias instruções, tudo para falhar. Alguém pode me ajudar a desvendar a declaração de regex, visto que eu me esforço para fazer isso?

Um exemplo:   Digamos que eu tenha as seguintes palavras aleatórias em um arquivo de texto:

boo djhg
bio jdjjf
dgdhd bgo
ghhh

Em seguida, as palavras 'boo', 'bio' e 'bgo' precisam ser destacadas.

    
por Jennifer Bester 29.05.2017 / 20:48

3 respostas

3

O comando que você está procurando é grep , e a expressão regular que você deseja é b[[:alnum:]]*[ig][[:alnum:]]*o .

  • [[:alnum:]] corresponderá a um único caractere alfanumérico.
  • * corresponderá a qualquer número (incluindo zero) da expressão anterior.
  • [ig] corresponderá a um único i ou g .
  • Todos os outros caracteres ( b e o ) nesta expressão regular específica correspondem a eles próprios.

O uso de [[:alnum::]]* em vez de .* evita palavras correspondentes que contenham espaços.

grep é usado como

grep OPTIONS 'EXPRESSION' INPUT-FILES

e emitirá as linhas correspondentes a EXPRESSION para sua saída padrão (o terminal, neste caso).

Nesse caso, você desejaria usar as opções -w e -o , o que força a expressão a corresponder palavras (sequências de caracteres cercadas por caracteres não-palavra) e a retornar apenas os dados correspondentes (não o linha inteira).

$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo

Você mencionou que queria destacar as palavras correspondentes. Isso é algo que o GNU grep pode fazer. Estou soltando a opção -o aqui para obter toda a linha de cada partida, caso contrário, você apenas obterá o mesmo resultado de antes, mas destacado, o que seria entediante.

$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio jdjjf
dgdhd bgo

Como você pode ver, isso mostra apenas as correspondências nas linhas que contêm correspondências. Para ver a entrada completa (linhas pares sem correspondência), com as correspondências destacadas, temos que descartar a opção -w e fazer

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' words
boo djhg
bio jdjjf
dgdhd bgo
ghhh

Tivemos que adicionar a opção -E , pois | é uma expressão regular estendida. O \b corresponderá a qualquer limite de palavra.

    
por 29.05.2017 / 21:00
0

Eu usaria grep para fazer isso:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^b começa com "b"
  • .* qualquer coisa a qualquer momento
  • (i|g)* "i" ou "g" uma ou mais vezes
  • o$ termina com "o"
por 29.05.2017 / 21:00
0
set -f; for w in 'cat /usr/share/dict/words'; do
   case $w in b*[ig]*o ) echo "$w" ;; esac
done
# you could as well say: $(< /usr/share/dict/words) in place of the backquoted cat.
# if your version of bash supports it.

Estamos dividindo o arquivo de palavras em palavras $w e, em seguida, fazendo um caractere curinga.

  • O padrão curinga é: b * [ig] * o que deve ser lido como:
  • $ w deve começar com a letra "b".
  • $ w deve terminar com a letra "o".
  • $ w deve conter um "i" ou um "g" em algum lugar entre eles para corresponder
  • Após uma partida bem-sucedida, exibimos a palavra.
por 29.05.2017 / 22:24