2013-11-20 57 views
0

我想查找並替換KSH中的conf文件中的變量(使用SED)。 我的問題是:通過考慮變量的名稱可以包含特殊字符,什麼是正確的正則表達式模式來識別KSH變量(如$ toto或$ {toto})?在文件中查找並用SED替換變量

下面是一個例子:

比方說,我有var_1=value1var_2=value2在我當前的shell(出口-p的grepable)。

配置文件之前,查找和替換

PARAM1=$var_1/tata.txt 
PARAM2=${var_2}/tata.txt 

配置文件後,查找和替換

PARAM1=value1/tata.txt 
PARAM2=value2/tata.txt 

我要做的:

  1. 查找$ VAR_1和$ { var_2}然後在conf文件中(使用泛型正則表達式,我想我不知道在conf文件中是否有變量)
  2. 搜索每個的值 export -p | grep var_1 export -p | grep的VAR_2
  3. 由以前的搜索

謝謝您的回答中找到的值替換的conf文件中的這些2個變量。

+0

提供輸入文件和預期輸出的示例。 – anubhava

+0

@anubhava:這裏是一個例子(直接在帖子中) – pierrefevrier

回答

0

使用awk(我確實看到你所要求的sed

awk '{gsub(/\${?var_1}?/,x);gsub(/\${?var_2}?/,y)}1' x="$var_1" y="$var_2" file 
PARAM1=value1/tata.txt 
PARAM2=value2/tata.txt 
+0

謝謝,但我想我不知道在conf文件中的變量的名稱(我需要更通用的東西) – pierrefevrier

+0

然後,你需要一個bash腳本運行命令每個變量。 – Jotne

1

這是一個的情況下危險eval會派上用場:

while read line; do 
    eval echo "$line" 
done <inputfile> outputfile 
+0

有趣,但我需要檢查每個變量,如果它存在於導出-p(用於錯誤處理) – pierrefevrier

+1

@pfevrier我不知道我是否理解你是正確的,但如果你想讓shell試圖替換未定義的變量,你可以說:'(set -u; while read line; do eval echo「$ line」; done < inputfile > outputfile)''。如果一個變量未定義,這會產生一個錯誤。 – devnull

+0

我不知道這個選項,也許是解決方案。我要測試它:) – pierrefevrier

0
Src=/tmp/sed.Source 
FIn=/tmp/sed.In 
FOut=/tmp/sed.Out 

# take all variable as source but could be reduce (highly recommended) 
set > ${Src} 

cp YourFile ${FIn} 
sed 's/=/ /' ${Src} | while read vName vValue 
do 
    sed "s/\$$vName/$vValue/g;s/\${$vName}/$vValue/g" ${FIn} > ${FOut} 
    mv ${Fout} ${FIn} 
done 

#rm ${Src} 
cat ${Fin} 
#rm ${Fin} 

主要關注的是當內容(價值)的變量包含正則表達式的特殊車型炭像/.*所以不是爲

最好的解決方案可以在sed做只有機智變量值的預加載和標記比遞歸更換

0

你可以試試這個一襯墊解決方法:

cat config 
PARAM1=$var_1/tata.txt 
PARAM2=${var_2}/tata.txt 

(export var_1=value1; export var_2=value2; bash -x ./config 2>&1 >/dev/null|sed 's/^+ //') 
PARAM1=value1/tata.txt 
PARAM2=value2/tata.txt