Reemplazar variables leídas de un archivo de texto (para que puedan ser interpretadas)

Reemplazar variables leídas de un archivo de texto (para que puedan ser interpretadas)

Quiero almacenar en un archivo de texto alguna declaración de selección que contenga variables como una fecha:

$ cat res.txt
select field1, field2 from log and log_time~'"${TODAY}"*'

Quiero usar un script que analice este archivo y, para cada declaración, lo ejecute. Por supuesto, ${TODAY}será reemplazado por una variable.

Desafortunadamente, ${TODAY}nunca se reemplaza por una fecha en la que leí el archivo...

¿Hay una manera de lograr esto?

ACTUALIZAR:

Digamos que quiero iterar a través de un archivo que contiene algunas declaraciones SQL y quiero ejecutarlas usando psql (postgres).

Aquí está el archivo:

$cat sql.res
select path from log where log_host='toto' and log_time~'"${TODAY}"*' and log_msg='POLICY MISSING' and entry_status!='ACK' and path~'^/logs-${cli}/"${THREE_MONTHS_AGO}"_[0-9][0-9][0-9][0-9][0-9][0-9](_[0-9]{1,2}\.|\.)log(ptr|initial_ptr|account_ptr)?\.bz2$';

Ahora en un script bash, quiero:

$cat script.sh
TODAY=$(date "+%Y-%m-%d")
THREE_MONTHS_AGO=$(date -d "$TODAY -91 days" "+%Y-%m-%d")
THREE_MONTHS_AGO_2=$(date -d "$TODAY -92 days" "+%Y-%m-%d")
ONE_MONTH_AGO=$(date -d "$TODAY -36 days" "+%Y-%m-%d")
ONE_MONTH_AGO_2=$(date -d "$TODAY -37 days" "+%Y-%m-%d")
YESTERDAY=$(date -d "$TODAY -1 day" "+%Y-%m-%d")
while read item; do
    psql -P pager=off -t -c "$item" log | sed -e 's|^ *||' -e '/^$/d' > result.txt
done < sql.res

Lamentablemente, las variables no se utilizan en el script. Entonces probé eval. Tengo así:

$while read item; do
    c=$(echo $item | sed "s:':@:g" | sed "s:|:EE:g" | sed "s:(:AA:g" | sed "s:):BB:g" | sed 's:]{:TT:g' | sed 's|\.|OO|g')
    b=$(eval echo ${c} 2>&1)
    d=$(echo $b | sed "s:@:':g" | sed "s:EE:|:g" | sed "s:AA:(:g" | sed "s:BB:):g" | sed 's:TT:]{:g' | sed 's:OO:\\\.:g' )
    echo  "-> $b"
done < sql.res

Pero tengo algunos problemas con

\.

Respuesta1

Simplemente puedes reemplazar la cadena de la variable con el valor:

sed -e "s/\${TODAY}/$TODAY/g" res.txt

Pero:

  • Asegúrese absolutamente de haber ejecutado la variable a través de una API confiable (como creada por la base de datos proporcionada o parte de una API de lenguaje de programación popular).noalgo casero)mecanismo de escape.
  • También tendrás que escapar de cualquier personaje.específico ased(y no puedes simplemente agregar barras invertidas antes de cada carácter).
  • Estás utilizando dos niveles de comillas, algo que probablemente no era tu intención.
  • Utilice un lenguaje mejor que Bash para esto. Es horrendo para este tipo de cosas, porque todas las citas y evasiones que complican y hacenen realidadEs fácil pasar por alto casos especiales. Python, Ruby e incluso PHP manejan este tipo de cosas mucho mejor que Bash.

información relacionada