我想打印目录中的所有.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"