使用 perl 一行代码过滤文件列表

Filtering a list of files with a perl one-liner

我正在尝试使用 grep 的 -P 选项在命令行进行过滤,该选项应该使用 perl 的正则表达式

ls | grep -P ZZZZZTYT.vcf.gz 有效

但是

ls | grep -P ZZZZZTYT.vcf.gz$

不起作用。对于 GNU grep 3.4,锚点似乎不适用于 grep -P

当然,这些例子很简单。

我也尝试过使用单行过滤,la perl one-liner like grep?

ls | perl -ne 'print  if not $_ =~ m/\.gz$/'

但这也没有用。

ls | perl -ne 'print  if not /\.gz$/'

我的猜测是最好的选择是 perl 单行程序。

如何重写上面的一行代码以在文件列表中进行 grep?

尽管您的示例中存在一些问题,但我无法重现您的问题。

对于命令 ls | grep -P ZZZZZTYT.vcf.gz 有效而 ls | grep -P ZZZZZTYT.vcf.gz$ 无效,我的第一个猜测是您的文件末尾有空格或其他“不可见”字符。您可以尝试 ls | cat -A(或 cat -veT),看看是否确实有比您看到的更多的内容。无论如何,您的正则表达式可以用文字点 (\.) 更好地编写,因为 . 单独匹配任何内容。

在你的 perl 在线用户中,你试图打印 </code> 而这个变量是空的,来自 <a href="https://perldoc.perl.org/perlvar#$%3Cdigits%3E-(,-,-...)" rel="nofollow noreferrer"><code>perldoc perlvar:

$<digits> (, , ...)
     Contains the subpattern from the corresponding set of capturing
     parentheses from the last successful pattern match, not counting
     patterns matched in nested blocks that have been exited already.

     These variables are read-only and dynamically-scoped.

     Mnemonic: like \digits.

我想你想要打印 $_,当你使用 -n 开关时,这个变量保存当前行的内容(参考 perlvar 和 perlfunc)。你可以将你的 perl oneliner 重写为:

ls | perl -ne'/\.gz$/ or print' # for not .gz files

ls | perl -ne'/\.gz$/ and print' # list .gz files

使用您的示例,从网上删除 </code> 就足够了。</p> <p>如前所述,您需要检查文件名末尾是否有内容。</p> <p>如果您的文件名中有“坏字符”,这个 oneliner 将适用于列出 .gz 文件:</p> <pre><code>ls | perl -ne'/\.gz.*$/ and print'