【问题标题】:Match, substitute and expand shell variable using perl使用 perl 匹配、替换和扩展 shell 变量
【发布时间】:2019-12-29 08:03:51
【问题描述】:

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

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}不应该展开。
我没有找到一个简单的解决方案来匹配两个大括号。
你能帮忙吗?问题是匹配没有大括号或在两个大括号内,否则不匹配也不替换。

【问题讨论】:

    标签: regex perl substitution


    【解决方案1】:
    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_
    

    【讨论】:

    • ikegami,谢谢你的回答。你能告诉我?: 是如何工作的吗?
    • 表达式$ENV{$1//$2}//$&defined $ENV{$1} ? $ENV{$1} : $&一样吗?
    • Re "你能告诉我?: 是如何工作的吗?" (?:...) 是正则表达式模式,就像(...) 是 Perl 和数学:它分组,压倒一切。例如,ab|cd 匹配 abcd,而 a(?:b|c)d 匹配 abdacd。我用它来避免重复\$。作为主角,这应该会使匹配更有效率。
    • Re "same as",不,你甚至不用$2f() // g() 等价于defined(f()) ? f() : g(),只是f() 只计算一次,所以$ENV{$1//$2}//$& 等价于defined($ENV{ defined($1) ? $1 : $2 }) ? $ENV{ defined($1) ? $1 : $2 } : $&
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2015-03-10
    • 2011-10-17
    • 2016-10-06
    • 1970-01-01
    • 2014-05-24
    • 2020-12-03
    相关资源
    最近更新 更多