Почему grep все еще включает.и .. в моем списке файлов, даже если он не соответствует регулярному выражению, которое я ему даю? - PullRequest
1 голос
/ 09 марта 2012

То, что я пытаюсь сделать, это получить коллекцию всех диаграмм UTF16 Unicode.Я скачал все файлы pdf из http://unicode.org/charts/PDF/ и решил использовать perl, чтобы избавиться от всех специальных диаграмм, или диаграмм UTF32 со следующим скриптом:

#!/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);

Когда я запускаю скрипт, яполучить следующий вывод:

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...

Первые 2 строки по-прежнему . и .. И, я думаю, потому что я пытаюсь отсоединить ., он удаляет большое количество файлов, которые яне хотел убирать.Я не уверен, связана ли проблема с моими регулярными выражениями grep, readdir или unlink, но он удаляет гораздо больше файлов, чем следует.

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Эта строка:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/}

Включает только файлы, которые не соответствуют ни регулярному выражению. Это включает в себя . и ... Чтобы исключить эти два, вам придется расширить это:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/ && !/^\.{1,2}$/}
5 голосов
/ 09 марта 2012

Это ваше регулярное выражение:

grep {!/^U[0-9,A-F]{4}\.pdf/ && !/utf16only.pl/} readdir($dir);

Это говорит "соответствует всем файлам, которые не соответствуют U[0-9,A-F]{4}.pdf (примечание - вы действительно хотите эту запятую там?), Итакже не utf16only.pl.

Поскольку . и .. не соответствуют U [0-9A-F] {4} .pdf и не соответствуют utf16only.pl, они такжеудален.

Добавьте !/^\./ в grep, чтобы исключить также эти файлы из списка удаления:

grep {!/^U[0-9A-F]{4}\.pdf/ && !/^\./ && !/utf16only.pl/} readdir($dir);

Примечание. Я изменил [0-9,A-F] на [0-9A-F],потому что я не думаю, что в именах ваших файлов будут запятые.

...