2013-11-20 59 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