grep сообщает «недопустимый диапазон символов»

grep сообщает «недопустимый диапазон символов»

Поэтому я использую комбинацию findи grepдля фильтрации списка имен файлов из простого текстового документа.

Вот команда, которую я запускаю:

find /Volumes/Documents\ -\ Part\ 1/July 2009 -type f | grep -vf files.txt

В files.txt у меня есть это:

/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages

Я хочу, чтобы он выводил все несовпадающие строки, но вместо этого получаю это:

grep: invalid character range

В чем причина? В files.txt есть еще много чего, я просто опустил это, потому что это было бы слишком долго. У меня там тоже есть несколько символов unicode. Может ли это вызывать какие-либо проблемы?

Mac OS X Yosemite, bash 3.2.57(1)-релиз, grep (BSD grep) 2.5.1-FreeBSD

решение1

TLDR; добавить-F


Параметр -fgrep используется для ссылки на файл, содержащий списокузоры- ваш файл не содержит список шаблонов, он содержит список имен файлов

человек grep

-f ФАЙЛ, --file=ФАЙЛ Получить шаблоны из ФАЙЛА, по одному на строку. Пустой файл не содержит ни одного шаблона и, следовательно, не соответствует ничему. (-f указано в POSIX.)

Вам необходимо убедиться, что все метасимволы в именах файлов экранированы, если вы не хотите, чтобы они рассматривались как метасимволы.


$ cat files.txt
/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages

$ echo a | grep -vf files.txt
a

Мне кажется, что ваш файл files.txt, вероятно, содержит больше, чем четыре строки, которые вы показываете.

Проверьте файл с помощью

$ wc files.txt
  4  21 221 files.txt

$ sum files.txt
43924     1

Если сомневаетесь, используйте -Fопцию (заглавная буква F) — но тогда вы не экранируете метасимволы в file.txt.

Обратите внимание на следующее

$ cat files.txt
/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages
[z-a]

$ echo aaa | grep -vf files.txt
grep: Invalid range end

$ echo aaa | grep -Fvf files.txt
aaa

Эта -Fопция сообщает grep, что ваши шаблоны поиска не содержат регулярных выражений и что их следует обрабатывать как обычный текст.

Связанный контент