Perl - 仅在发生替换时才在命令行上打印替换的字符串



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

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

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

有没有办法指定perl只有在实际发生替换时才应该打印输出?

如果你使用-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)$/'

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

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

最新更新