我想我发现了一些你可能感兴趣的东西。请注意,它只使用 sed、就地编辑和 bash。在我们开始之前,让我们看看输入和输出:
环境文件/变量:如下所示,我们的文件"myenv"有3个变量,它们的值如下所示。
%_Host@User> file myenv
myenv: ASCII text
%_Host@User> cat myenv
export FOO='This is FOO'
export BAR='This is BAR'
export BAZ='This is BAZ'
%_Host@User> env|egrep "FOO|BAR|BAZ"
FOO=This is FOO
BAR=This is BAR
BAZ=This is BAZ
%_Host@User>
执行操作的目标文件:我们的目标是读取文件sample.txt,如果在加载的环境文件中找到变量的值,则将其替换为实际值。我们的第 4 行没有在我们的变量文件中定义,所以它应该保持不变。
%_Host@User> cat sample.txt
${FOO} is TRUE
${BAR} is TRUE
${BAZ} is TRUE
${BRAZ} is TRUE
%_Host@User>
SCRIPT 结果和最终输出: 为了演示,我正在打印从目标文件sample.txt 读取的行。如果容器内的变量(例如:${FOO} 在任何一行中找到,我们将其替换为它的值(例如:This is FOO 在这种情况下),我们可以从 env 获取
%_Host@User> ./env.sh sample.txt ; cat sample.txt
[1.] Line is: [${FOO} is TRUE]
[1.] VAR:[FOO] has VALUE:[This is FOO]
[2.] Line is: [${BAR} is TRUE]
[2.] VAR:[BAR] has VALUE:[This is BAR]
[3.] Line is: [${BAZ} is TRUE]
[3.] VAR:[BAZ] has VALUE:[This is BAZ]
[4.] Line is: [${BRAZ} is TRUE]
[4.] VAR:[BRAZ] not found and NO CHANGE IN FILE !!
This is FOO is TRUE
This is BAR is TRUE
This is BAZ is TRUE
${BRAZ} is TRUE
%_Host@User>
如上所示,我们已经成功地将${FOO} 更改为This is FOO,并保持任何其他/s(不在我们的env 文件中)不变。
SCRIPT 及其工作原理:
#!/bin/bash
i=1
cfgfile="$1"
cat $cfgfile | while read line
do
echo "[${i}.] Line is: [$line]"
var=$(echo $line | sed 's#^.*\${\(\w*\)}.*$#\1#g')
val=$(env |grep "$var"| cut -f2 -d"=")
env|grep "${var}=" >/dev/null
if [ $? -eq 0 ]
then
echo "[$i.] VAR:[$var] has VALUE:[$val]"
# Perform inplace editing.
sed -i "s@\${$var}@$val@g" "$cfgfile"
else
echo "[$i.] VAR:[$var] not found and NO CHANGE IN FILE !!"
fi
((i++)) ; echo
done
以上脚本遵循以下步骤:
-
i=1 只是我们的柜台。没那么重要。仅用于演示目的。
-
cfgfile="$1" 接受来自提示的文件。
- 我们 cat 文件并在 while 循环中逐行读取。
- 我们回显该行,然后从
${FOO} 中提取FOO,并从环境中提取其实际值,即This is FOO,并将其存储在var 和val 中。很简单。
- 我们测试这个变量
FOO是否在env中定义并检查命令状态。
- 如果已定义,即
$? 是 0 或 True,我们将继续执行就地编辑,否则我们将不做任何更改。
我认为您应该尝试使用双引号 (") 而不是单引号 (') 的原始命令。它应该可以工作。
如果这有用,请告诉我们。
干杯。