grep sagt "ungültiger Zeichenbereich"

grep sagt "ungültiger Zeichenbereich"

Daher verwende ich eine Kombination aus findund, grepum eine Liste von Dateinamen aus einem einfachen Textdokument herauszufiltern.

Hier ist der Befehl, den ich ausführe:

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

In files.txt habe ich Folgendes:

/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

Ich möchte, dass alle nicht übereinstimmenden Zeilen ausgegeben werden, stattdessen erhalte ich jedoch Folgendes:

grep: invalid character range

Was ist die Ursache dafür? files.txt enthält noch viel mehr, ich habe es einfach weggelassen, weil es zu lang wäre. Es sind auch mehrere Unicode-Zeichen darin. Könnte das Probleme verursachen?

Mac OS X Yosemite, Bash 3.2.57(1)-Version, grep (BSD grep) 2.5.1-FreeBSD

Antwort1

TLDR; hinzufügen-F


Mit der -fOption grep wird auf eine Datei verwiesen, die eine Liste vonMuster- Ihre Datei enthält keine Liste von Mustern, sondern eine Liste von Dateinamen

Mann grep

-f DATEI, --file=DATEI Muster aus DATEI abrufen, eins pro Zeile. Die leere Datei enthält null Muster und stimmt daher mit nichts überein. (-f wird von POSIX angegeben.)

Sie müssen sicherstellen, dass alle Metazeichen in Ihren Dateinamen maskiert werden, es sei denn, Sie möchten, dass sie als Metazeichen behandelt werden.


$ 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

Mir scheint, dass Ihre Datei „files.txt“ wahrscheinlich mehr als die vier Zeilen enthält, die Sie anzeigen.

Überprüfen Sie die Datei mit

$ wc files.txt
  4  21 221 files.txt

$ sum files.txt
43924     1

Im Zweifelsfall verwenden Sie die -FOption (Großbuchstabe F) – Sie maskieren dann jedoch keine Metazeichen in der Datei.txt.

Beachte das Folgende

$ 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

Die -FOption teilt grep mit, dass Ihre Suchmuster keine regulären Ausdrücke enthalten und dass sie als einfacher Text behandelt werden sollen.

verwandte Informationen