使用Perl单行命令过滤文件列表 解决grep -P锚点匹配失效问题
问题解决方法
错误原因说明
- 你之前写的Perl单行命令无法生效的核心原因是误用了
$1变量:你的正则表达式没有用括号定义任何捕获分组,$1始终是空值,自然不会有有效输出 - GNU grep 3.4的
-P参数本身是支持$行尾锚点匹配的,你之前匹配失败大概率是ls输出附带了颜色控制符这类不可见行尾字符,或者正则中的.没有转义导致匹配偏差
正确Perl单行写法
1. 等效默认grep:保留匹配正则的行
比如要过滤所有以.gz结尾的文件:
ls | perl -ne 'print if /\.gz$/'
如果要精确匹配ZZZZZTYT.vcf.gz文件(完全匹配整行):
ls | perl -ne 'print if /^ZZZZZTYT\.vcf\.gz$/'
2. 等效grep -v:排除匹配正则的行
比如要过滤掉所有以.gz结尾的文件:
ls | perl -ne 'print if !/\.gz$/'
3. 适配带颜色的ls输出
如果ls开启了默认颜色输出,行首行尾会有不可见控制字符,可以先清理再匹配:
ls | perl -ne 's/\e\[[0-9;]*m//g; print if /\.gz$/'
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

