替換從文字檔案讀取的變數(以便可以解釋它們)

替換從文字檔案讀取的變數(以便可以解釋它們)

我想在文字檔案中儲存一些包含日期等變數的選擇語句:

$ 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

不幸的是,腳本中沒有使用這些變數。所以我嘗試了評估。我有這樣的:

$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 好得多。

相關內容