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

时间:2013-11-25 20:26:47

标签: linux perl command-line

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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