繁体   English   中英

使用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{$1} ? $ENV{$1} : $&#eg'

结果1$b_${c}_

b_永远不会正确扩展。 没关系。 使用花括号{}解决了该问题。

下次尝试最有效

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

结果是1-2_3_ 但是${a$b}不应该扩展。
我没有找到匹配两个大括号的简单解决方案。
你能帮忙吗? 问题是匹配时不带花括号或两个花括号都在里面,否则不匹配也不替代。

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

测试:

$ export a=1 b=2 c=3

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM