envsubst基于字符串

时间:2017-01-30 19:45:50

标签: shell text environment-variables

我的文本文件中有以下两行

$MyEnv
someText$MyEnv

我想使用envsubst来替换MyEnv变量的第二次出现。如何使用字符串“someText”来区分变量的第一次和第二次出现以及env变量中的替换?

所以envsubst < file1 >file2

file 2
$MyEnv
someTextValueofMyEnv

这怎么可能

1 个答案:

答案 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循环的每次迭代填充whileecho行通过管道传输到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 utilitiesLinux Standard Base commands(LSB)的一部分。

为了完全可移植(并且完全使用sh builtins!),您需要使用eval,这是不安全的,无需额外的检查。