Sed - 使用'/ 1'获取环境变量的值

时间:2016-08-19 17:19:38

标签: sed environment-variables

我有以下sed命令:

sed -i -E "s/\{\{(.*)\}\}/$(echo "$\1")/g" test.conf

test.conf中,我有这个:

this is a {{TEST}}
and this is an {{ANSWER}} here.

我设置了以下环境变量:

export TEST=1234
export ANSWER=5678

当我运行sed命令时,我最终得到了这个结果:

this is a $TEST
and this is an $ANSWER here.

我分别想要12345678echo命令是否有理由按字面解释事物?

2 个答案:

答案 0 :(得分:1)

反向引用由单个sed命令在内部使用。 echo不知道sed反向引用,并且在sed命令运行之前shell会调用,因此$(echo "$\1")输出$\1所以

sed -i -E "s/\{\{(.*)\}\}/$(echo "$\1")/g" test.conf

真的是:

sed -i -E "s/\{\{(.*)\}\}/$\1/g" test.conf

因此你看到了输出。

无论如何,sed是针对单个行的简单替换,对于你应该使用awk的任何其他内容:

$ export TEST=1234 ANSWER=5678
$ awk 'match($0,/(.*)\{\{(.*)\}\}(.*)/,a){$0=a[1] ENVIRON[a[2]] a[3]} 1' file
this is a 1234
and this is an 5678 here.

上面使用GNU awk为第3个arg匹配(),与其他awk它是:

$ awk 'match($0,/\{\{(.*)\}\}/){$0=substr($0,1,RSTART-1) ENVIRON[substr($0,RSTART+2,RLENGTH-4)] substr($0,RSTART+RLENGTH)} 1' file
this is a 1234
and this is an 5678 here.

如果有人建议在sed输出上运行eval或类似内容 - 不要这样做(google eval is evil和朋友),只需使用上面的awk命令进行简单的字符串操作。

答案 1 :(得分:0)

您可以使用方便地拥有perl哈希变量的%ENV,有关详细信息,请参阅perldoc

perl -pe 's/\{\{(.*)\}\}/$ENV{$1}/' test.conf