Seu comando:
sed "/import:/a\$IMPORTED" infile
Está inserindo o texto literal $IMPORTED
no linux e no GNU sed. O problema é que o shell está interpretando a barra invertida antes do $
. Você pode citar corretamente:
sed '/import:/a\'"$IMPORTED" infile
Ou divida o valor em sua própria parte do script:
sed -e '/import:/a\' -e "$IMPORTED" infile
É sempre melhor criar scripts com aspas simples.
Para substituir um valor old
por new
, que pode conter um número indefinido de linhas, é necessário
-
Primeiro: capture todas as linhas no espaço padrão:
sed 'H; 1h; $! d; x' infil
-
Defina valores para alterar:
old = 'original' new = 'newvalue'
-
Remover o valor antigo (que deve existir):
sed -E -e 'H; 1h; $! d; x' -e 's / (import:) (\ n)' "$ old" '/ \ 1 / g' infil
-
Adicione a nova entrada:
sed -E -e 'H; 1h; $! d; x' -e 's / (import:) (\ n)' "$ old" '/ \ 1 / g' -e 's / ( import:) / \ 1 \ n '"$ new"' / g 'infil
Há um problema de canto em que, se a variável $old
contiver um valor nulo (vazio), uma nova linha será removida. Para resolver isso, precisamos:
sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\n)$old"}"'//g' -e 's/(import:)/\n'"$new"'/g' infile