【问题标题】:Replace multiple charcter using regex substitution使用正则表达式替换替换多个字符
【发布时间】:2012-09-11 20:54:46
【问题描述】:

我正在尝试对 acpi 命令的输出执行正则表达式替换。我的 perl 单线是:

acpi | perl -F/,/ -alne 'print $F[1] if ($F[1]=~s!\s|%!!)'

上面一行的输出是87%,而我需要的输出只是87,所以它不会替换字符串中的%

现在acpi 命令的输出是

Battery 0: Discharging, 87%, 05:54:56 remaining

print $F[1] 的输出是

ronnie@ronnie:~$  acpi | perl -F/,/ -alne 'print $F[1]'
 87%   #space followed by 87%#
ronnie@ronnie:~$ 

现在奇怪的是,如果我在上面尝试相同的 perl 单行:

echo " 86%" | perl -nle 'print if s!\s|%!!g'

它工作正常并输出86

那么,为什么它不能与 acpi 命令一起使用。

PS:我知道这可以通过使用 sed/awk 来实现,但我很感兴趣为什么我的解决方案不起作用。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    你的单线没有像你预期的那样工作,因为

    s!\s|%!!
    

    替换任一空格百分号,而不是两者。

    如果您希望它同时替换两者,请添加全局 /g 修饰符:

    s!\s|%!!g
    

    就像您在另一个示例中巧合的那样。

    您也可以考虑使用字符类而不是交流发电机:

    s![\s%]!!g
    

    如果您的输出遵循您显示的格式,您最好使用简单的正则表达式:

    echo Battery 0: Discharging, 87%, 05:54:56 remaining|perl -nlwe 'print /(\d+)%/'
    87
    

    【讨论】:

    • 谢谢。我不知道我是怎么错过的。
    【解决方案2】:

    这个按预期工作:

    echo " 86%" | perl -F/,/ -alne 'print $F[1] if ($F[1]=~s!\s*(\d+)%!$1!)'
    

    【讨论】:

      【解决方案3】:

      您缺少g 修饰符

      acpi | perl -F/,/ -alne 'print $F[1] if ($F[1]=~s!\s|%!!g)'
                                                          ____^
      

      【讨论】:

        【解决方案4】:

        您的s!...!...! 首先匹配空格,然后什么都不做。尝试添加g 修饰符,如... s!\s|%!!g

        【讨论】:

          【解决方案5】:

          我试过了,效果很好。

          echo "Battery 0: Discharging, 87%, 05:54:56 remaining" | perl -F, -alne '$F[1]=~s/\s|%//g;print $F[1]'
          87
          

          问题在于 g 修饰符。

          g 实际上表示替换该行中的所有匹配项,但默认行为是仅替换第一个匹配项。 因此,由于$F[1] 的开头有空格,因此只替换空格,而忽略该行中的其余字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-07-13
            • 1970-01-01
            • 1970-01-01
            • 2015-11-30
            • 2020-10-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多