【问题标题】:Find and replace variables with SED in a file在文件中使用 SED 查找和替换变量
【发布时间】:2013-11-20 13:25:39
【问题描述】:

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

这是一个例子:

假设我在当前的 shell 中有 var_1=value1var_2=value2(可在 export -p 中使用 grep)。

查找替换前的配置文件

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

查找替换后的配置文件

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

我必须做的:

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

感谢您的回答。

【问题讨论】:

  • 提供输入文件的示例和您的预期输出。
  • @anubhava:这是一个例子(直接在帖子中)

标签: sed ksh


【解决方案1】:

这是一种邪恶危险eval会派上用场的情况:

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

【讨论】:

  • 有趣但我需要检查每个变量是否存在于 export -p 中(用于错误处理)
  • @pfevrier 我不确定我的理解是否正确,但如果您希望 shell 在尝试替换未定义变量时提示您,您可以说:( set -u ; while read line; do eval echo "$line"; done &lt; inputfile &gt; outputfile )。如果变量未定义,这将给出错误。
  • 我不知道这个选项,也许这是解决方案。我要测试它:)
  • 不限于变量替换,例如 $(( $var_1 + $var_2 )) 将执行 sum ant 这可能是不想要的
  • @NeronLeVelu 感谢您的教育。
【解决方案2】:

使用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

【讨论】:

  • 谢谢,但我想我不知道 conf 文件中变量的名称(我需要更通用的东西)
  • 那么你需要一个 bash 脚本来为每个变量运行一个命令。
【解决方案3】:
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 中通过预加载变量值和标记而不是递归替换来完成

【讨论】:

    【解决方案4】:

    您可以尝试这种单行解决方法:

    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
    

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2012-02-14
      • 1970-01-01
      • 2016-05-12
      • 2020-08-05
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多