用文件替换文件中的shell变量引用

时间:2017-02-01 22:44:03

标签: bash sed

我可以使用sed:

替换文件中的占位符(以变量名命名)
ID="toto"
SECRET="tata"
sed -i -e "s/\${ID}/$ID/" -e "s/\${SECRET}/$SECRET/" $file

它取代了这个:

$clientId = '${ID}';
$clientSecret = '${SECRET}';

$clientId = 'toto';
$clientSecret = 'tata';

我正在尝试通过使用参数的循环来完成这项工作:

ID="toto"
SECRET="tata"
OTHER="franck"
./config.sh $file $ID $SECRET $OTHER

config.sh

for var in "${@:2}"; do
  echo "$var" # toto or tata or franck
  echo $!{var} # always var whatever I try, would like ID or {SECRET} or ${OTHER} 
  SETTINGS="$SETTINGS -e "s/\${var}/$var/"" # so this has no effect  
done

FILE=$1
sed -i $SETTINGS $FILE

2 个答案:

答案 0 :(得分:1)

使用sed生成要运行的sed脚本,将数据编辑为一系列sed命令,然后使用-f /dev/stdin将脚本提供给{{} 1}}(这可以避免必须清理自己背后的临时文件)。

sed

空备份后缀表示法不适用于BSD(macOS)FILE="$1" shift printf '%s\n' "$@" | sed 's/^\([A-Z][A-Z]*\)=\(.*\)/s%\\${\1}%\2%/' | sed -i.bak -f /dev/stdin "$FILE" ,因此我将sed替换为后缀。

这假定调用的格式为:

.bak

必须同时提供名称和值。给定包含以下内容的数据文件file="data" ID="toto" SECRET="tata" OTHER="franck" ./config.sh $file "ID=$ID" "SECRET=$SECRET" "OTHER=$OTHER"

data

输出文件是:

$clientId = '${ID}';
$clientSecret = '${SECRET}';
$publication = '${OTHER}';

生成的脚本格式为:

$clientId = 'toto';
$clientSecret = 'tata';
$pulication = 'franck';

您可以使用任何未使用的字符代替s%\${ID}%toto% s%\${SECRET}%tata% s%\${OTHER}%franck% 符号;控制字符如 Control-A 可能非常有效。

答案 1 :(得分:1)

您可以稍微重写config.sh以解决问题:

# grab the output file name
file=$1
shift
# loop through the rest of args which are names of variables that
# need to be substituted
for var in "${@}"; do
  # note: ${var} and ${!var} do get evaluated inside single quotes so long as 
  # there are enclosing double quotes around them
  sed_expr=${sed_expr}" -e 's/\${$var}/${!var}/'"
done

# enclose sed_expr as well file in double quotes to prevent
# word splitting and globbig
sed -i "$sed_expr" "$file"

并按如下方式调用它。需要传递变量名称和其值:

export ID="toto" SECRET="tata" OTHER="franck"
./config.sh file ID SECRET OTHER

或者如果你不想做export

ID="toto" SECRET="tata" OTHER="franck" ./config.sh file ID SECRET OTHER
脚本生成的

sed表达式:

-e 's/${ID}/toto/' -e 's/${SECRET}/tata/' -e 's/${OTHER}/franck/'

上述电话后的文件:

$clientId = 'toto';
$clientSecret = 'tata';
$publication = 'franck';