如何在bash中处理变量替换?

时间:2015-08-31 02:25:13

标签: python bash perl sed environment-variables

所以我有一些文件包含占位符值,如@USER@@SHELL@(全部大写变量名,括在@' s中,表示环境变量名称)。我想要做的是用它们引用的环境变量的实际值替换这些占位符。

过去当我看到这种事情已经完成时,特定变量通常是硬编码的,例如:

sed -e 's/@SOME_VARIABLE@/$SOME_VALUE/' <infile >outfile

但这对我当前的用例不起作用,因为我想更灵活地支持任意替换。我在python中编写了这段代码,它完全符合我的要求:

import re
import fileinput

from os import environ
from sys import stdout

pat = re.compile(r'@([A-Z_]+)@')

for line in fileinput.input():
    stdout.write(pat.sub(lambda match: environ[match.group(1)], line))

但如果我能帮助它,我不想使用python。当然有一种方法可以使用perl或sed单线程来做到这一点吗?

2 个答案:

答案 0 :(得分:3)

perl -pe 's/\@(\w+)\@/$ENV{$1}/g'是完成这项工作的一种方式。

如果要在环境中不存在文件中提到的变量时抛出错误,可以使用

perl -pe 's/\@(\w+)\@/die "$1 not found\n" unless exists $ENV{$1}; $ENV{$1}/eg'

答案 1 :(得分:0)

啊,自从我玩perl以来已经太久了,这正是我想要的:

perl -pe 's/@([A-Z_]+)@/$ENV{$1} or die "$1 undefined"/eg' <infile >outfile

然后在Makefile中你需要逃避美元符号:

envsubst = perl -pe 's/@([A-Z_]+)@/$$ENV{$$1} or die "$$1 undefined"/eg'

install:
    $(envsubst) <infile1 >outfile1
    $(envsubst) <infile2 >outfile2