O caso é semelhante a este: Anexando uma string contendo escapar personagem com sed
Sugiro a mesma resposta (adaptada):
for file in "${filelist[@]}"; do
sed -i "1i\
$(echo -E "$prefix" | sed -e 's/\/\\/g' | sed -e '$! s/$/\/')" "$file" &&
echo "$suffix" >> "$file"
done
O sed
command i
requer que cada linha, exceto a última, seja finalizada com uma barra invertida (isso estava faltando na resposta referida). Além disso, as barras invertidas precisam ser dobradas, portanto, sed
não tentará interpretá-las. O echo
produz o conteúdo da variável $prefix
. Em seguida, no pipeline, o comando sed
duplica as barras invertidas. O segundo comando sed
adiciona barras invertidas no final de cada linha, exceto a última.
EDITAR Como funciona o programa sed $! s/$/\/
:
Primeiro, o endereço $
significa executar o comando que segue na última linha. $!
nega isso, então o comando será executado em todas as linhas, exceto na última.
Em seguida, o comando s///
faz substituição. Ele substituirá a string vazia no final da linha, denotada por $
, por uma barra invertida. Mas a barra invertida é um caractere especial, por isso precisamos escapar dela com outra barra invertida para que sed
a leia corretamente.