首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么grep仍然包含。然后..。在我的文件列表中,即使它与我给出的regex不匹配?

为什么grep仍然包含。然后..。在我的文件列表中,即使它与我给出的regex不匹配?
EN

Stack Overflow用户
提问于 2012-03-09 14:27:33
回答 2查看 312关注 0票数 1

我正在尝试做的是获得所有UTF16 Unicode图表的集合。我从http://unicode.org/charts/PDF/下载了所有的pdf文件,并决定使用perl通过以下脚本去除所有的特殊图表或UTF32图表:

代码语言:javascript
运行
复制
#!/usr/bin/perl

opendir(my $dir, ".");
my @files = grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir);
for $f (@files)
{
    print "deleting $f...\n";
    #unlink $f;
}
closedir($dir);

当我运行该脚本时,我得到以下输出:

代码语言:javascript
运行
复制
C:\Users\Evan\Downloads\Unicode 6.1 Charts>utf16only.pl
deleting ....
deleting .....
deleting 10FF80.pdf...
deleting ErrorLink.pdf...
deleting U10000.pdf...
deleting U100000.pdf...
deleting U10080.pdf...
deleting U10100.pdf...
deleting U10140.pdf...
deleting U10190.pdf...
deleting U101D0.pdf...
deleting U10280.pdf...
deleting U102A0.pdf...
deleting U10300.pdf...
deleting U10330.pdf...
deleting U10380.pdf...
deleting U103A0.pdf...
deleting U10400.pdf...
deleting U10450.pdf...
deleting U10480.pdf...
deleting U10800.pdf...
deleting U10840.pdf...
deleting U10900.pdf...
deleting U10920.pdf...
deleting U10980.pdf...
deleting U109A0.pdf...
deleting U10A00.pdf...
deleting U10A60.pdf...
deleting U10B00.pdf...
deleting U10B40.pdf...
deleting U10B60.pdf...
deleting U10C00.pdf...
deleting U10E60.pdf...
deleting U10FF80.pdf...
deleting U11000.pdf...
deleting U11080.pdf...
deleting U110D0.pdf...
deleting U11100.pdf...
deleting U11180.pdf...
deleting U11680.pdf...
deleting U12000.pdf...
deleting U12400.pdf...
deleting U13000.pdf...
deleting U16800.pdf...
deleting U16F00.pdf...
deleting U1B000.pdf...
deleting U1D000.pdf...
deleting U1D100.pdf...
deleting U1D200.pdf...
deleting U1D300.pdf...
deleting U1D360.pdf...
deleting U1D400.pdf...
deleting U1EE00.pdf...
deleting U1F000.pdf...
deleting U1F030.pdf...
deleting U1F0A0.pdf...
deleting U1F100.pdf...
deleting U1F200.pdf...
deleting U1F300.pdf...
deleting U1F600.pdf...
deleting U1F680.pdf...
deleting U1F700.pdf...
deleting U1FF80.pdf...
deleting U20000.pdf...
deleting U2A700.pdf...
deleting U2B740.pdf...
deleting U2F800.pdf...
deleting U2FF80.pdf...
deleting U3FF80.pdf...
deleting U4FF80.pdf...
deleting U5FF80.pdf...
deleting U6FF80.pdf...
deleting U7FF80.pdf...
deleting U8FF80.pdf...
deleting U9FF80.pdf...
deleting UAFF80.pdf...
deleting UBFF80.pdf...
deleting UBOOP.pdf...
deleting UCFF80.pdf...
deleting UDFF80.pdf...
deleting UE0000.pdf...
deleting UE0100.pdf...
deleting UEFF80.pdf...
deleting UF0000.pdf...
deleting UFFF80.pdf...

前两行仍然是...,我想是因为我试图取消.的链接,所以它删除了大量我不想删除的文件。我不确定问题出在我的正则表达式、grepreaddir还是unlink上,但是它删除的文件远远超过了它应该删除的文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-09 14:33:41

这一行:

代码语言:javascript
运行
复制
grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/}

只包含与regex都不匹配的文件。这包括...。要排除这两个,您必须扩展它:

代码语言:javascript
运行
复制
grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/ && !/^\.{1,2}$/}
票数 6
EN

Stack Overflow用户

发布于 2012-03-09 14:34:43

这是您的正则表达式:

代码语言:javascript
运行
复制
grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir);

这会显示“匹配所有与U[0-9,A-F]{4}.pdf不匹配的文件(注意-您真的希望在其中包含逗号吗?),并且也不是utf16only.pl

由于...与U0-9A-F{4}.pdf不匹配,也不与utf16only.pl匹配,因此它们也将被删除。

在您的grep中添加一个!/^\./,以从删除列表中排除这些文件:

代码语言:javascript
运行
复制
grep {!/^U[0-9A-F]{4}\.pdf/ && !/^\./ && !/utf16only.pl/} readdir($dir);

注意--我把你的[0-9,A-F]改成了[0-9A-F],因为我不认为你的文件名里面会有逗号。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9629843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档