Como obter o comando sed para procurar apenas palavras completas?

0

Sou bastante novo no Linux e recentemente comecei a experimentar com a linha de comando. Eu decidi fazer um arquivo e o chamei de 'hi.txt'. O conteúdo do documento era:

This is hi.txt.
hi 
hi
hi

Eu usei o comando sed -i 's/hi/hotel/g' hi.txt na esperança de fazer todos os 'hi's no documento mudarem para hotel. Esta foi a saída:

Thotels is hotel.txt
hotel
hotel
hotel 

Como você pode ver, o 'hi' é a palavra 'This' também foi alterada. Existe uma maneira de impedir que isso aconteça?

    
por Robbie White 10.09.2015 / 18:58

2 respostas

2

O comando s/// espera que o parâmetro "search" seja uma expressão regular . A maioria das versões de sed deve suportar a correspondência \b , que é uma correspondência de largura zero em uma palavra não-palavra-chave ou em um limite de borda da palavra. "Word" neste caso é definido como um caractere que é uma letra, dígito ou sublinhado ( _ ). Por exemplo, se assumirmos que a string c++ está sozinha em uma linha em seu arquivo, \b corresponderia às seguintes posições:

  1. Imediatamente antes do c .
  2. Entre o c e o primeiro + .
  3. Imediatamente após o último + .

O comando a seguir deve fornecer os resultados desejados:

sed -i 's/\bhi\b/hotel/g' hi.txt

A palavra this não corresponderá porque o h é precedido por um caractere de palavra ( t ) e o i é seguido por um caractere de palavra ( s ). No entanto, a seqüência de caracteres This is hi.txt corresponderá à segunda instância de hi , porque o espaço ao redor e . são caracteres não pertencentes à palavra.

    
por 10.09.2015 / 19:37
0
$ sed -e 's/\([^[:alnum:]_.-]\)hi\([^[:alnum:]_.-]\)/hotel/g' -e 's/^hi$/hotel/' <file
This is hi.txt.
hotel
hotel
hotel
    
por 10.09.2015 / 19:06