Muitas vezes, gostaria de pegar alguns dados rapidamente e aplicá-los a um modelo no bash.
por exemplo, imagine fazer o seguinte
$ seq 1 2 | eztemplate 'this is a {1} test'
this is a 1 test
this is a 2 test
$ eztemplate 'this is a {1} test' hi 'there now'
this is a hi test
this is a there now test
$ eztemplate /tmp/template /tmp/alphabet | head
this is a a test
of this system a
this is a b test
of this system b
...
Escrevi um script bash muito simples que faz isso, mas estava pensando em permitir vários parâmetros, como dados de estilo CSV, por linha de dados.
Já existe algo melhor do que meu pequeno script, dado o seguinte?
- Eu quero que ele exija apenas ferramentas unix posix básicas e coisas comumente instaladas como perl ou awk, mas não requer que nenhum módulo seja instalado adicionalmente por perl, por exemplo
- Ele pode aceitar várias colunas de dados, por linha de dados no arquivo de dados.
- Basicamente é um script bash que não requer a instalação de mais nada: D
- Uma intenção secundária é permitir que outros que não são bons em scripts bash tenham uma ferramenta simples para processar modelos para dados repetidos
Os dados e o modelo variam muito, mas o primeiro exemplo com o qual eu queria fazer era aplicar 4 ids a uma carga JSON
modelo
{
"tenantId": "{1}",
"key": "some.key",
"value": "some.value"
}
dados
my/super/01cbf4e9779649038f0bd753747c8b26
my/test/01cbf4e9779649038f0bd753747c8b26
ez/test/01cbf4e9779649038f0bd753747c8b26
rad/data/df3a47fed39d453f836f9b2196332029
eztemplate
#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; PATH="$DIR:$PATH"
function show_help()
{
ME=$(basename "$0")
IT=$(cat <<EOF
replaces vars in a template, one for each line of stdin
e.g.
$ seq 1 2 | $ME 'this is a {1} test'
this is a 1 test
this is a 2 test
$ $ME 'this is a {1} test' hi 'there now'
this is a hi test
this is a there now test
$ $ME /tmp/template /tmp/alphabet
this is a a test
of this system a
this is a b test
of this system b
...
EOF
)
echo "$IT"
echo
exit
}
if [ -z "$1" ]
then
show_help
fi
if [ "$1" = "help" ] || [ "$1" = '?' ] || [ "$1" = "--help" ] || [ "$1" = "h" ]; then
show_help
fi
function process_template(){
DATA=$1
VAR=$2
if [ -f "$DATA" ]; then
DATA=$(cat "$DATA")
fi
echo "$DATA" | sed "s#{1}#$VAR#g"
}
TEMPLATE=$1
if [ -t 0 ]
then
if [ -f "$2" ]; then
# allow first 2 parameters to be files, TEMPLATE and then DATA
DATA_FILE=$2
cat "$DATA_FILE" | while read line
do
process_template "$TEMPLATE" "$line"
done
else
shift;
for line in "$@"
do
process_template "$TEMPLATE" "$line"
done
fi
else
# loop over lines from stdin
while IFS= read -r line; do
process_template "$TEMPLATE" "$line"
done
fi
Para o exemplo que você cita, a solução mais natural parece ser
Claramente
awk
é igual à tarefa, também, se desejado.