GNU grep v3.3 ложное совпадение с регулярным выражением Perl - PullRequest
0 голосов
/ 06 ноября 2019

Предыдущий вопрос Grep - список файлов, которые начинаются с двоичной байтовой последовательности regex? спрашивает о том, как искать начальные байты в файле. Этот пост более тщательно документирует, что GNU grep, кажется, ведет себя несовместимо с его документацией. Я бы хотел решить другую проблему, но этот пост более специфичен для grep.

Bash ниже показывает, что файл без необходимого 2-байтового шаблона в начале файла некорректно сопоставлен. Однако, если я сохраню только начало файла, то 2-байтовая последовательность должным образом не найдена.

dell@DELL-E6440:~$ cp 130913-SEMSA.pdf junk.txt
dell@DELL-E6440:~$ hexdump -C junk.txt | head -n1
00000000  25 50 44 46 2d 31 2e 34  0a 31 20 30 20 6f 62 6a  |%PDF-1.4.1 0 obj|
dell@DELL-E6440:~$ LC_ALL=C grep -lP "\A\xff\xd8" junk.txt
junk.txt
dell@DELL-E6440:~$ dd if=130913-SEMSA.pdf bs=10 count=1 of=junk.txt
1+0 records in
1+0 records out
10 bytes copied, 0.0062894 s, 1.6 kB/s
dell@DELL-E6440:~$ hexdump -C junk.txt | head -n1
00000000  25 50 44 46 2d 31 2e 34  0a 31                    |%PDF-1.4.1|
dell@DELL-E6440:~$ LC_ALL=C grep -lP "\A\xff\xd8" junk.txt
dell@DELL-E6440:~$

Когда я использую обычный целевой шаблон printtable-ASCII, grep правильно сопоставляет строку вначало файла и не совпадает с ним, если он не находится в начале файла.

Что может быть в файле полного размера, который дает ложное совпадение для двоичных данных? Я запутался, потому что grep должен заботиться только о первых 2 байтах файла, так как была указана опция Perl regex \ A, а "grep --help" подтверждает, что Perl regex реализован в GNU grep v3.3. используя.

Спасибо за любые ваши идеи!

...