我的文本文件中有以下两行
$MyEnv
someText$MyEnv我想使用envsubst只替换MyEnv变量的第二次出现。如何使用字符串"someText“来区分变量的第一次和第二次出现,并在env变量中进行替换?
所以envsubst < file1 >file2
file 2
$MyEnv
someTextValueofMyEnv这怎么可能
发布于 2017-01-31 19:01:31
下面的代码将替换输入第二行中的所有环境变量。所请求的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的内容逐行读取,为while循环的每一次迭代填充$line。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标准公用设施或Linux标准基本命令 (LSB)的一部分。
要完全可移植(并且完全使用sh!),您需要使用eval,这是不安全的,不需要进行大量额外的检查。
https://stackoverflow.com/questions/41944211
复制相似问题