pt sed substituir apenas algumas letras regex

0

Estou praticando meu sed e regex e estou tentando substituir todas as instâncias de "cheer" por lalaland no arquivo abaixo, excluindo coisas como aplausos:

ubuntu@ip-172-31-58-40:~$ cat test
cheer
cheering
.
word
cheerytree
acheerytree

ubuntu@ip-172-31-58-40:~$ sed -i "s/cheer[^ing]/lalaland/g" test
ubuntu@ip-172-31-58-40:~$ cat te
cat: te: No such file or directory
ubuntu@ip-172-31-58-40:~$ cat test
cheer
cheering
.
word
lalalandtree
alalalandtree

Eu não entendo porque o primeiro item, cheer, é deixado junto.

Obrigado

    
por D.Zou 09.02.2017 / 18:20

2 respostas

5

O padrão [^ing] não faz o que você pensa: corresponde a um caractere, que deve ser nenhum dos i , n ou g .

Se o seu problema puder ser reformulado como "substituir ocorrências de elogio como palavra inteira ", então o seguinte pode funcionar, usando o marcador para palavra limites, \b :

sed 's/\bcheer\b/lalaland/g'
    
por 09.02.2017 / 18:29
1

A expressão [^ing] significa qualquer caractere único, exceto i , n ou g . Portanto, cheer[^ing] não corresponde no caso de cheer sozinho porque não há nenhum caractere adicional para corresponder (ou não corresponder).

O que você parece estar tentando implementar é lookahead negativo , ou seja, uma asserção de comprimento zero que corresponde a cheer , exceto onde é seguida pela string ing . Isso não é fácil em sed , mas é relativamente fácil em perl usando a sintaxe (?!ing) , ou seja,

perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree

Veja as Asserções Lookahead e Lookbehind Zero-Length

    
por 09.02.2017 / 18:39