使用 perl 匹配、替换和扩展 shell 变量

Match, substitute and expand shell variable using perl

下一个代码完全适用于没有花括号的变量{}

export a=1 b=2 c=3
echo '$a$b_${c}_' | perl -pe 's#$([A-Za-z_]+)#defined $ENV{} ? $ENV{} : $&#eg'

结果1$b_${c}_

b_ 永远不会正确展开。没关系。使用大括号 {}.

解决了该问题

下一次尝试最多成功

echo '${a-$b}_${c}_' |perl -pe 's#$\{?([A-Za-z_]+)\}?#defined $ENV{} ? $ENV{} : $&#eg'

结果是 1-2_3_。但是${a,$b}不应该展开.
我没有找到匹配两个大括号的简单解决方案。
你能帮忙吗?问题是在没有大括号的情况下匹配或在两个大括号内匹配否则不匹配也不替换。

perl -pe's#$(?:([A-Za-z_]+)|\{([A-Za-z_]+)\})#$ENV{//}//$&#eg'

测试:

$ export a=1 b=2 c=3

$ echo '$a$b_${c}_'    | perl -pe's#$(?:([A-Za-z_]+)|\{([A-Za-z_]+)\})#$ENV{//}//$&#eg'
1$b_3_

$ echo '${a-$b}_${c}_' | perl -pe's#$(?:([A-Za-z_]+)|\{([A-Za-z_]+)\})#$ENV{//}//$&#eg'
${a-2}_3_