我想在目录中打印所有.sh文件。所以我尝试了以下命令 -
ll | perl -pe 's/(.*)([0-9]*:[0-9]* *)(.*\.sh)/$3/'
最后一个匹配(.*sh)
是我感兴趣的。该命令适用于所有具有.sh扩展名的文件。但是,它还会打印无法替换的所有其他文件(即整行)。
有没有办法可以指定perl只有在实际发生替换时才打印输出?
答案 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"