我有以下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.
我分别想要1234
和5678
。 echo
命令是否有理由按字面解释事物?
答案 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