Você não pode dividir seu modelo em dois arquivos, um antes da parte variável e outro depois dele? O shell pode então concatená-los assim:
( cat foo.output.template.before; cat ; cat foo.output.template.after; ) >foo.output
Eu tenho um script de configuração que basicamente faz isso:
#!/bin/bash
source vars.sh
cat >foo.output <<EOF
# some static stuff (many lines...)
variable_bit=($SOME_VAR, $SOME_OTHER_VAR, ...)
# some more static stuff (many lines...)
EOF
Seria melhor ter outro arquivo, chamá-lo de foo.output.template
, que se parecia com isso
# some static stuff (many lines...)
VARIABLE_BIT
# some more static stuff (many lines...)
Então, meu script de configuração poderia fazer algo parecido com isto
sed 's/VARIABLE_BIT/<<STDIN>>/' foo.output.template >foo.output <<EOF
variable_bit=($SOME_VAR, $SOME_OTHER_VAR, ...)
EOF
Isso não funcionará, e eu não sei se sed
pode fazer isso, mas a intenção é que
VARIABLE_BIT
Pode o sed
, awk
ou algum outro utilitário comum * nix fazer isso facilmente?
Você não pode dividir seu modelo em dois arquivos, um antes da parte variável e outro depois dele? O shell pode então concatená-los assim:
( cat foo.output.template.before; cat ; cat foo.output.template.after; ) >foo.output
Pelo menos se você tiver o GNU sed
, então,
$ cat foo.output.template
# some static stuff (many lines...)
VARIABLE_BIT
# some more static stuff (many lines...)
e
$ cat bar
hello
hello
você pode igualar VARIABLE_BIT
, ler e inserir o conteúdo de bar
e excluir VARIABLE_BIT
:
$ cat bar | sed '/^VARIABLE_BIT/{
r /dev/stdin
d
}' foo.output.template
# some static stuff (many lines...)
hello
hello
# some more static stuff (many lines...)
Você pode criar um one-liner se tiver o cuidado de evitar que d
seja interpretado como parte do nome do arquivo
cat bar | sed -e '/^VARIABLE_BIT/{r /dev/stdin' -e 'd;}' foo.output.template
Redirecionar para um arquivo de saída da maneira normal, por exemplo, > foo.output
Nota: usei cat bar
apenas para ilustrar a entrada padrão; Se você realmente quiser usar um arquivo para o texto de substituição, você pode fazer isso diretamente, por exemplo
sed -e '/^VARIABLE_BIT/{r bar' -e 'd;}' foo.output.template > foo.output
cat before.input - after.input >output <<EOF
whatever $FOO $BAR
EOF