我想在KSH的conf文件中找到并替换变量(使用SED)。 我的问题是:通过考虑变量的名称可以包含特殊字符,识别KSH变量(如$ toto或$ {toto})的正确正则表达式模式是什么?
以下是一个例子:
假设我的当前shell中有var_1=value1
和var_2=value2
(导出-p中的grepable)。
查找和替换之前的配置文件
PARAM1=$var_1/tata.txt
PARAM2=${var_2}/tata.txt
查找和替换后的配置文件
PARAM1=value1/tata.txt
PARAM2=value2/tata.txt
我必须做的事情:
感谢您的回答。
答案 0 :(得分:1)
这是 evil 和 dangerous eval
派上用场的情况之一:
while read line; do
eval echo "$line"
done < inputfile > outputfile
答案 1 :(得分: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
答案 2 :(得分: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中完成
答案 3 :(得分: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