使用bash/sed搜索和替换文件中的变量

use*_*603 5 bash sed

我正在尝试编写一个bash脚本(script.sh)来搜索和替换in​​put.sh文件中的一些变量.但是我只需要修改variable_list文件中存在的变量,并保留其他变量.

variable_list

${user}  
${dbname}
Run Code Online (Sandbox Code Playgroud)

input.sh

username=${user}  
password=${password}  
dbname=${dbname}
Run Code Online (Sandbox Code Playgroud)

预期的输出文件

username=oracle  
password=${password} > This line won't be changed as this variable(${password}) is not in variable_list file
dbname=oracle
Run Code Online (Sandbox Code Playgroud)

以下是我尝试使用的脚本,但我无法找到正确的sed表达式

script.sh

export user=oracle  
export password=oracle123  
export dbname=oracle

variable='variable_list'  
while read line ;  
do  
 if [[ -n $line ]]     
 then  
  sed -i 's/$line/$line/g' input.sh > output.sh  
 fi  
done < "$variable"    
Run Code Online (Sandbox Code Playgroud)

Fat*_*ror 4

这可以工作:

#!/bin/bash

export user=oracle  
export password=oracle123  
export dbname=oracle

variable='variable_list'  
while read line ;  
do  
 if [[ -n $line ]]
 then
  exp=$(sed -e 's/\$/\\&/g' <<< "$line")
  var=$(sed -e 's/\${\([^}]\+\)}/\1/' <<< "$line")
  sed -i "s/$exp/${!var}/g" input.sh
 fi  
done < "$variable"
Run Code Online (Sandbox Code Playgroud)

第一个sed表达式转义了 $,它是正则表达式元字符。第二个仅提取变量名称,然后我们使用间接获取当前 shell 中的值并在表达式中使用它sed

编辑

与其多次重写文件,不如这样做更有效,为以下内容构建参数列表sed

#!/bin/bash

export user=oracle  
export password=oracle123  
export dbname=oracle

while read var
do
    exp=$(sed -e 's/\$/\\&/g' <<< "$var")
    var=$(sed -e 's/\${\([^}]\+\)}/\1/' <<< "$var")
    args+=("-e s/$exp/${!var}/g")
done < "variable_list"

sed "${args[@]}" input.sh > output.sh
Run Code Online (Sandbox Code Playgroud)