在文件中使用SED查找和替换变量

时间:2013-11-20 13:25:39

标签: sed ksh

我想在KSH的conf文件中找到并替换变量(使用SED)。 我的问题是:通过考虑变量的名称可以包含特殊字符,识别KSH变量(如$ toto或$ {toto})的正确正则表达式模式是什么?

以下是一个例子:

假设我的当前shell中有var_1=value1var_2=value2(导出-p中的grepable)。

查找和替换之前的配置文件

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

查找和替换后的配置文件

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

我必须做的事情:

  1. 在conf文件中找到$ var_1和$ {var_2}(使用通用正则表达式,我想我不知道conf文件中是否有变量)
  2. 使用 export -p |搜索每个值grep var_1 export -p | grep var_2
  3. 将conf文件中的这2个变量替换为上一次搜索
  4. 找到的值

    感谢您的回答。

4 个答案:

答案 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