使用sed

时间:2015-10-09 12:37:03

标签: regex linux bash shell sed

我正在尝试编写一个sed命令来替换文件中的标记,其中包含来自环境变量的值,如下所示:

export my_var=foo
echo 'something {{my_var}} bar' | sed -r "s/\{\{(.*?)\}\}/$\1/g"

我想获取令牌的名称(在这种情况下为 my_var ),然后用相同的名称替换环境变量的值。

这可能吗?目前上面打印something $my_var bar而不是something foo bar这是我想要的。

如果使用sed无法使用其他工具,我可以使用其他工具。

2 个答案:

答案 0 :(得分:3)

{{my_var}}替换为$my_var后,您需要明确发送第二轮替换字符串。

eval

$ eval echo "$(echo 'something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g')"
something foo bar

或使用子shell

$ echo 'echo something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g' | sh
something foo bar

Perl只能对替换文本进行第二轮评估,而不是整个输出(使用s///函数的e修饰符):

$ echo 'something {{my_var}} bar' | perl -pe 's/\{\{(\w+)\}\}/$ENV{$1}/eg' 
something foo bar

答案 1 :(得分:0)

如果你想使用变量,那么在变量之前添加$ sign。

导出my_var = foo

  回声"某事{{$ my_var}} bar" | sed -r" s / {{(。*?)}} / $ \ 1 / g" | sed' s | [$] || g'

输出:

  

foo bar