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

Linux Perl-仅当发生替换时才在命令行上打印替换的字符串,linux,perl,command-line,Linux,Perl,Command Line,我想打印目录中的所有.sh文件。所以我尝试了以下命令- ll | perl -pe 's/(.*)([0-9]*:[0-9]* *)(.*\.sh)/$3/' 最后一个匹配(*sh)是我感兴趣的。该命令适用于所有扩展名为.sh的文件。但是,它也会打印无法替换的所有其他文件(即整行) 是否有一种方法可以指定perl仅在实际发生替换时才打印输出 为什么不使用?这正是创建它的目的: find . -type f -regex ".*\.sh" 如果使用-n而不是-p,Perl将在这些行上循环,而

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

ll | perl -pe 's/(.*)([0-9]*:[0-9]* *)(.*\.sh)/$3/'
最后一个匹配
(*sh)
是我感兴趣的。该命令适用于所有扩展名为.sh的文件。但是,它也会打印无法替换的所有其他文件(即整行)

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

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

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

如果使用
-n
而不是
-p
,Perl将在这些行上循环,而不会自动打印出来。然后,您可以添加您自己的
print
语句,该语句取决于替换的成功:

ll | perl -ne 'print if s/(.*)([0-9]*:[0-9]* *)(.*\.sh)/$3/'
这只比等效的
sed-ne的/../…/p'
长一点,这是我在简单情况下使用的,除了替换+打印之外,不需要更复杂的逻辑

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

ll | perl -ne 'print if s/^.*[0-9]:[0-9]*\s+(.*\.sh)$/$1/'
或者,由于您是自己打印,而不是让
-p
替您打印,因此您可以跳过替换,让
$\u
单独打印,而只打印您想要的零件。这意味着你不会免费获得这条新线。在这里,我使用
-l
来补偿这一事实:

ll | perl -lne 'print $1 if /^.*[0-9]:[0-9]*\s+(.*\.sh)$/'
但您也可以使用现代便利运营商

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

+1是的,但我只是用这个例子来学习Perl!谢谢你的命令!