【问题标题】:Perl - Print substituted string on command line only if substitution occuredPerl - 仅在发生替换时在命令行上打印替换的字符串
【发布时间】:2013-12-10 17:48:18
【问题描述】:

我想打印一个目录中的所有 .sh 文件。所以我尝试了以下命令 -

ll | perl -pe 's/(.*)([0-9]*:[0-9]* *)(.*\.sh)/$3/'

最后一个匹配 (.*sh) 是我感兴趣的。该命令适用于所有具有 .sh 扩展名的文件。但是,它还会打印无法替换的所有其他文件(即整行)。

有没有一种方法可以指定 perl 仅在实际发生替换时才打印输出?

【问题讨论】:

    标签: linux perl command-line


    【解决方案1】:

    如果您使用-n 而不是-p,Perl 将循环遍历这些行而不自动将它们打印出来。然后,您可以添加自己的 print 语句,以替换成功为条件:

    ll | perl -ne 'print if s/(.*)([0-9]*:[0-9]* *)(.*\.sh)/$3/'
    

    这仅比等效的 sed -ne 's/.../.../p' 长一点,这是我将用于不需要更复杂逻辑而不是替换+打印的简单情况。

    此外,这些额外的组在此示例中没有做任何事情,因此您可以简化为:

    ll | perl -ne 'print if s/^.*[0-9]:[0-9]*\s+(.*\.sh)$/$1/'
    

    或者,由于您是自己打印而不是让-p 为您打印,您可以跳过替换并单独留下$_,而只打印您想要的部分。不过,这意味着您不会免费获得换行符。这里我使用-l 来弥补这一事实:

    ll | perl -lne 'print $1 if /^.*[0-9]:[0-9]*\s+(.*\.sh)$/'
    

    但您也可以使用现代便利运算符say

    ll | perl -nE 'say $1 if /^.*[0-9]:[0-9]*\s+(.*\.sh)$/'
    

    【讨论】:

      【解决方案2】:

      为什么不使用find?这正是它的创建目的:

      find . -type f -regex ".*\.sh" 
      

      【讨论】:

      • +1 是的,但我只是用这个作为学习 Perl 的例子!不过感谢您的命令!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多