Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用perl匹配、替换和扩展shell变量_Regex_Perl_Substitution - Fatal编程技术网

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_