Regex 使用perl匹配、替换和扩展shell变量
下一个代码完全适用于没有大括号的变量Regex 使用perl匹配、替换和扩展shell变量,regex,perl,substitution,Regex,Perl,Substitution,下一个代码完全适用于没有大括号的变量{} 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}
{}
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\u3
。但是${a
,$b}
不应展开。我没有找到一个简单的解决方案来匹配两个大括号。
你能帮忙吗?问题是在没有大括号的情况下匹配,或者在两个大括号内匹配,否则不匹配且不替换
perl -pe's#\$(?:([A-Za-z_]+)|\{([A-Za-z_]+)\})#$ENV{$1//$2}//$&#eg'
测试:
池上,谢谢你的回答。您能告诉我
?:
是如何工作的吗?表达式$ENV{$1//$2}/$&
是否与定义的$ENV{$1}相同$ENV{$1}:$&
?Re“你能告诉我?:
是如何工作的吗?”(?:…)
对于正则表达式模式就像(…)
对于Perl和Mathematics:It组,重写优先级一样。例如,ab | cd
匹配ab
和cd
,而a(?:b | c)d
匹配abd
和acd
。我用它来避免重复\$
。作为主角,这应该会使匹配更有效。如果“与”相同,则不会。您甚至不使用$2
f()//g()
等同于defined(f())?f():g()
除了f()
只计算一次之外,因此$ENV{$1//$2}/$&
等同于定义的($ENV{defined($1)?$1:$2})$环境{defined($1)$1:$2}:$&
$ 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_