Especifique o tamanho da palavra em agrep?

6

Estou usando agrep para encontrar palavras de grafia similares, por exemplo:

agrep -1 hack /usr/share/dict/words

Mas ele retorna muitas palavras, então também espero que o comprimento da palavra seja igual à palavra-chave. Como posso especificar isso?

    
por Tim 21.12.2013 / 03:13

2 respostas

5

Usando 1 concordar

A chave para usar agrep é reconhecer que você pode controlar o custo de coisas como adicionar, substituir e excluir caracteres. Para inserção, é a opção -I . Para exclusão, é -D .

$ agrep -1 -I2 -D2 '^hack$' /usr/share/dict/words

Exemplo

$ agrep -1 -I2 -D2 '^hack$' /usr/share/dict/words
back
cack
fack
haak
hack
haik
hank
hark
hask
hawk
heck
hick
hock
huck
Jack
jack
lack
Mack
mack
Pack
pack
rack
sack
tack
Wack
wack
yack
Zack
zack

Detalhes

Portanto, se definirmos o custo da inserção 1 mais alto que o número de erros que estamos dispostos a tolerar e fizermos o mesmo para o custo das exclusões, nunca inseriremos ou excluiremos nenhum caractere, mantendo assim o tamanho, qual é o comprimento do padrão que estamos combinando, hack , ou seja, 4.

Portanto, no comando acima, definimos nossa margem de erro em 1 ( -1 ). Definimos nosso custo de fazer e inserir ou uma exclusão para 2 ( -I2 -D2 ). E guardamos nossos resultados para que eles correspondam apenas a strings que são palavras inteiras que começam e terminam com nosso padrão, ( ^hack$ ).

OBSERVAÇÃO: O acento circunflexo ( ^ ) significa o início da sequência e o cifrão ( $ ) o final. Estes são chamados de âncoras.

Usando 2 concordes

Como alternativa, você também pode usar 2 agreps.

$ agrep '^[a-zA-Z]{4}$' /usr/share/dict/words | agrep -1 'hack'

Exemplo

$ agrep '^[a-zA-Z]{4}$' /usr/share/dict/words | agrep -1 'hack'
back
cack
Chac
Chak
dhak
fack
haak
hack
haik
hake
hako
haku
hank
hark
hask
hawk
heck
hick
hock
huck
Jack
jack
lack
Mack
mack
Pack
pack
rack
sack
Shak
tack
thak
Wack
wack
yack
Zack
zack

Detalhes

O primeiro agrep é encarregado de encontrar o conjunto de seqüências de caracteres com 4 caracteres de comprimento. O segundo agrep reduz esse conjunto ainda mais para apenas strings que correspondam ao seu padrão de hack com um único erro permitido.

    
por 21.12.2013 / 03:31
1

Eu não sei como você poderia especificar isso para agrep No entanto, você pode usar o shell para resolver seu problema. Por exemplo, com bash . Na sequência: Defina a variável keyword to hack Defina o comprimento de keyword em    %código% Passe l para l por meio de uma variável chamada awk e especifique    que limit imprime registros cujo tamanho (conforme determinado pelo awk    função interna awk ) é igual a length

keyword=hack; l=${#keyword};
agrep -1 $keyword /usr/share/dict/words | awk -v limit=$l 'length == limit'
Jack
Mack
back
hack
hake
hank
hark
hawk
heck
hick
hock
jack
lack
pack
rack
sack
tack
yack
    
por 21.12.2013 / 03:22

Tags