Cod*_*lue 2 linux perl command-line
我想在目录中打印所有.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)$/'