Posso usar o sed / awk / etc para substituir partes de um arquivo por um texto de stdin?

0

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

  • lê foo.output.template
  • corresponde a VARIABLE_BIT
  • substitui isso por qualquer coisa que esteja em stdin
  • , em seguida, canaliza para foo.output

Pode o sed , awk ou algum outro utilitário comum * nix fazer isso facilmente?

    
por spraff 19.06.2018 / 22:40

3 respostas

0

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
    
por 19.06.2018 / 23:04
0

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
    
por 20.06.2018 / 14:40
0
cat before.input - after.input >output <<EOF
whatever $FOO $BAR
EOF
    
por 20.06.2018 / 14:45