Заменить переменную, считанную из текстового файла (чтобы ее можно было интерпретировать)

Заменить переменную, считанную из текстового файла (чтобы ее можно было интерпретировать)

Я хочу сохранить в текстовом файле некоторые операторы select, содержащие переменные, например дату:

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

Я хочу использовать скрипт, который будет анализировать этот файл и для каждого оператора выполнять его. Конечно, ${TODAY}будет заменено переменной.

К сожалению, ${TODAY}никогда не заменяется датой прочтения файла...

Есть ли способ этого добиться?

ОБНОВЛЯТЬ:

Допустим, я хочу выполнить итерацию по файлу, содержащему некоторые SQL-операторы, и выполнить их с помощью psql (postgres).

Вот файл:

$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$';

Теперь в скрипте bash я хочу:

$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

К сожалению, переменные не используются в скрипте. Поэтому я попробовал eval. У меня получилось так:

$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

Но у меня есть некоторые проблемы с

\.

решение1

Вы можете просто заменить переменную строку значением:

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

Но:

  • Будьте абсолютно уверены, что вы пропустили переменную через надежный (например, созданный предоставленной базой данных или частью API популярного языка программирования,нетчто-то домашнее)механизм эвакуации.
  • Вам также придется избегать любых персонажей.конкретных дляsed(и вы не можете просто добавить обратную косую черту перед каждым символом).
  • Вы используете два уровня кавычек, хотя, вероятно, не хотели этого делать.
  • Пожалуйста, используйте для этого язык получше, чем Bash. Это ужасно для такого рода вещей, потому что все эти цитирования и экранирования, которые усложняют и делают этоДействительноЛегко упустить особые случаи. Python, Ruby и даже PHP справляются с такими вещами гораздо лучше, чем Bash.

Связанный контент