Substituindo o final da palavra por outra coisa

0

Eu tenho isso:

echo "walking ringer talking"

Como uso o sed para alcançar a saída a seguir?

walked ringer talked

Eu tentei várias maneiras, mas não consegui fazê-lo funcionar. Os seguintes comandos são o que eu tentei.

echo "walking ringer talking" | sed 's/ing/ed/g'

Isso gera walked reder talked .

echo "walking ringer talking" | sed 's/ing$/ed/g' 

Isso gera walking ringer talked .

echo "walking ringer talking" | sed 's/^ing/ed/g;s/ing$/ed/g' 

Isso gera walking ringer talked .

Estou tentando fazer isso em um script bash.

    
por Subhaa Chandar 13.10.2016 / 15:25

4 respostas

0

adicione espaço 's/ing /ed /g; no seu terceiro teste;

#echo "walking ringer talking" | sed 's/^ing/ed/g;s/ing$/ed/g' 
echo "walking ringer talking" | sed 's/ing /ed /g;s/ing$/ed/g'

por exemplo:

user@host:/tmp/test$ echo "walking ringer talking" | sed 's/ing /ed/g;s/ing$/ed/g' 
walked ringer talked
    
por 13.10.2016 / 15:28
2

Para corresponder a um espaço ou nova linha no final do padrão, você pode usar:

sed -E 's/ing( |$)/ed/g'
    
por 13.10.2016 / 15:34
1

O Awk dividirá a string em três partes e aplicará a substituição aos elementos desejados. Então print $0 retornará toda a (nova) string.

echo $s | awk 'BEGIN{a[1]=a[3]}{for(x in a)gsub("ing","ed",$x); print $0 }'
    
por 13.10.2016 / 15:44
0

Você pode usar um marcador "fim da palavra":

$ echo "walking ringer talking" | sed 's/ing\>/ed/g'
walked ringer talked

\> corresponde onde você tem caracteres de palavra à esquerda e caracteres não de palavra à direita.

Ou menos específico, com um limite de palavras:

$ echo "walking ringer talking" | sed 's/ing\b/ed/g'
walked ringer talked

\b corresponde a qualquer limite de palavra, mas se segue caracteres de palavras, é equivalente a \> .

    
por 13.10.2016 / 16:13

Tags