substituir apenas o primeiro e único último jogo usando 'sed'

1

Eu quero substituir e a string antiga por uma nova. Isso é o que eu usei

sed -i "0,|$old|{s|$old|$new|g}" file

mas isso me dá um erro:

sed: -e expression #1, char 3: unexpected ','

Como mudar isso?

Como mudar apenas a última ocorrência?

exemplo

Apple / Banana / Apple / orange / Apple
                                    |
                                    |
                                   \-/
Apple / Banana / Apple / orange / Melon
    
por xyz 12.01.2015 / 20:25

2 respostas

2

Com exceção do comando substituto ( s ), você precisa dar um prefácio a um delimitador alternativo com uma barra invertida, ou seja, para usar | como um delimitador regex no intervalo, ele deve ser 0,\|$old|

Então

sed -i "0,\|$old|{s|$old|$new|g}" file

deve funcionar (embora os parênteses em torno da expressão substituta sejam desnecessários, já que é uma expressão única).

Observe que incluir o sinalizador g (global) fará o sed substituir todas as instâncias de $old na primeira linha de correspondência :

$ echo -e "old and bold\nolder and bolder\noldest and boldest" | sed "0,\|old| s|old|new|g"
new and bnew
older and bolder
oldest and boldest

Se você deseja substituir apenas a primeira instância, remova o g , por exemplo,

$ echo -e "old and bold\nolder and bolder\noldest and boldest" | sed "0,\|old| s|old|new|"
new and bold
older and bolder
oldest and boldest
    
por steeldriver 12.01.2015 / 20:49
0

Isso deve funcionar para você:

sed -i "0,/${old}/s,${old},${new}," file
    
por Marcin Kaminski 12.01.2015 / 20:42