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)