首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于字符串的envsubst

基于字符串的envsubst
EN

Stack Overflow用户
提问于 2017-01-30 19:45:49
回答 1查看 2K关注 0票数 0

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

代码语言:javascript
复制
$MyEnv
someText$MyEnv

我想使用envsubst只替换MyEnv变量的第二次出现。如何使用字符串"someText“来区分变量的第一次和第二次出现,并在env变量中进行替换?

所以envsubst < file1 >file2

代码语言:javascript
复制
file 2
$MyEnv
someTextValueofMyEnv

这怎么可能

EN

回答 1

Stack Overflow用户

发布于 2017-01-31 19:01:31

下面的代码将替换输入第二行中的所有环境变量。所请求的envsubst命令是唯一使用的非内置命令。

代码语言:javascript
复制
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循环的每一次迭代填充$lineecho行通过管道连接到file2

我们有一个行计数器$L,它在循环开始时递增。如果我们在第2行,我们通过envsubst发送这条线路。否则,我们就报告。

您还询问了如何使用字符串"someText“来区分事件。我不太清楚你这么说是什么意思,但想想这个:

代码语言:javascript
复制
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,这是不安全的,不需要进行大量额外的检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41944211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档