A sintaxe padrão para o comando a é:
sed -e 'a\
first line\
second line\
last line'
BSD (pelo menos FreeBSD e OS / X) sed retira os espaços em branco à esquerda e precisa do -e para contornar um bug . O GNU sed permite mover a primeira linha para a direita após o a\ , desde que não esteja vazia.
Então, você precisaria pré-processar a entrada:
VAR='content with
multiple lines
some with lead blanks
or even backslash\'
preprocessed_VAR=$(printf '%s\n' "$VAR" |
sed 's/\/&&/g;s/^[[:blank:]]/\&/;s/$/\/')
sed -i -e "/MatchingPattern/a\
${preprocessed_VAR%?}" somefile
(substitua -i por -i '' no FreeBSD ou OS / X).
No GNU / Linux e com o shell GNU ( bash ) ou zsh , você pode fazer isso:
sed -i '/MatchingPattern/r /dev/stdin' <<< "$VAR"
Isso funciona porque bash e zsh implementam strings aqui com arquivos temporários excluídos e / dev / stdin no Linux é implementado como um link simbólico para o arquivo (o que significa que ele pode ser aberto várias vezes e sempre , está aberto no começo).
Aqui você também pode usar o GNU awk :
(export VAR
gawk -i inplace '{print}; /MatchingPattern/{print ENVIRON["VAR"]}' somefile)
Ou perl (de onde vem esse -i ):
(export VAR
perl -pi -e '$_ .= "$ENV{VAR}\n" if /MatchingPattern/' somefile)