我的文本文件中有以下两行
$MyEnv
someText$MyEnv
我想使用envsubst来替换MyEnv变量的第二次出现。如何使用字符串“someText”来区分变量的第一次和第二次出现以及env变量中的替换?
所以envsubst < file1 >file2
file 2
$MyEnv
someTextValueofMyEnv
这怎么可能
答案 0 :(得分:1)
以下代码将替换输入第二行上的所有环境变量。请求的envsubst
命令是唯一使用的非内置命令。
L=0
while read line; do
L=$((L+1))
if [ $L = 2 ]; then
echo "$line" |envsubst
else
echo "$line"
fi
done < file1 > file2
开始阅读最后一行,因为它决定了输入和输出; file1
的内容逐行读取,为$line
循环的每次迭代填充while
。 echo
行通过管道传输到file2
。
我们有一个行计数器$L
,它在循环开始时递增。如果我们在第2行,我们会通过envsubst
发送该行。否则,我们只是举报。
您还询问了如何使用字符串“someText”来区分出现次数。我不确定你的意思,但请考虑一下:
while read line; do
# $line contains the string 'someText$MyEnv'
# (literally: $line does not match itself when removing that string)
if [ "$line" != "${line#*someText\$MyEnv}" ]; then
echo "$line" |envsubst
else
echo "$line"
fi
done < file1 > file2
注意:envsubst
只会替换导出的变量。 envsubst
命令不可移植;它是GNU gettext的一部分,不是POSIX standard utilities或Linux Standard Base commands(LSB)的一部分。
为了完全可移植(并且完全使用sh builtins!),您需要使用eval
,这是不安全的,无需额外的检查。