所以我有一些文件包含占位符值,如@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单线程来做到这一点吗?
答案 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