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