Obtendo exatamente a palavra correspondente

2

Examinei várias questões, mas elas não respondem satisfatoriamente à minha pergunta.

Eu preciso imprimir palavras que correspondam exatamente ao padrão e não às linhas que contêm essa palavra. Por exemplo:

I am going home. Home is where heart is.

Então, quando eu pesquiso com o padrão "home", eu devo pegar

home Home

Entendo que grep -o facilitará minha tarefa, mas minha grep não oferece suporte a essa opção. Então eu preciso de alguma outra solução.

Também preciso de uma correspondência exata. De modo que, se houver uma palavra homeless , ela não deve ser selecionada na seleção.

    
por haldar55 05.11.2014 / 05:53

6 respostas

2

Jogando com perl :

$ echo 'I am going home. Home is where heart is.' | 
    perl -lne 'for (split /\W+/) {print $& if /\bhome\b/i}'

E ainda mais curto, adaptado de Joseph R. comentário abaixo (graças a ele)

$ echo 'I am going home. Home is where heart is.' | 
    perl -lne 'print $& while /\bhome\b/ig'

Resultado:

home
Home
    
por 05.11.2014 / 15:24
0

usando awk :

echo "I am going home. Home is where heart is. I dont like Homework." | awk '{for(i=1;i<=NF;i++) {gsub(/[^a-zA-Z0-9]/,"",$i); if(match(tolower($i),/^(home)$/))print $i;}}'

saída:

home.
Home
    
por 05.11.2014 / 06:01
0

Usando awk para procurar palavras inteiras semelhantes a grep -o -w :

$ echo "I am going home. Home is where heart is." | awk -v 'RS=[^[:alnum:]_]' -v w="home" 'tolower($0)==w'
home
Home

Como Gilles aponta, isso requer um awk , como o GNU awk , que suporta expressões regulares para RS .

    
por 05.11.2014 / 18:34
0

Você pode usar tr para normalizar os separadores de palavras e, em seguida, grep para imprimir palavras correspondentes (com as opções -Fx para corresponder exatamente a uma string e -i para maiúsculas e minúsculas insensibilidade).

tr -cs A-Za-z \n | grep -Fxi home

Se você estiver em uma localidade não-ASCII, observe que muitas implementações de tr operam em bytes, não em caracteres. Use outra ferramenta como sed para realizar a normalização do separador de palavras.

sed 's/[^[:alpha:]][^[:alpha:]]*/\n/g' | grep -Fxi home

Todos os comandos nesta resposta são padrão POSIX.

    
por 07.11.2014 / 05:15
-1
printf %s\n 'I am going home. Home is where the heart is.' | 
sed 's/\([hH]ome\)*.\{,1\}//g'

OUTPUT

homeHome

    
por 05.11.2014 / 06:07
-1

Você pode iterar palavras, usar a palavra especificada e remover caracteres de pontuação

$ s="I am going home. Home is where heart is." 
$ for w in $s; do echo $w; done | grep -Ei '(^|[[:punct:]]*)home([[:punct:]]*|$)' | tr -d '[[:punct:]]'
home
Home
    
por 05.11.2014 / 07:26