grep
ist ein Textverarbeitungswerkzeug. Es erwartet, dass ihre Eingabe Textdateien sind . Es scheint, dass das gleiche gilt für tr
MacOS (obwohl tr
Binärdateien unterstützt werden sollen).
Computer speichern Daten als Folgen von Bytes . Ein Text ist eine Folge von Zeichen. Es gibt verschiedene Möglichkeiten, Zeichen als Bytes zu kodieren, sogenannte Zeichenkodierungen . Die De-facto-Standard-Zeichenkodierung in den meisten Ländern der Welt, insbesondere unter OSX, ist UTF-8 , eine Kodierung für den Unicode- Zeichensatz. Es gibt nur 256 mögliche Bytes, aber über eine Million mögliche Unicode-Zeichen, sodass die meisten Zeichen als Mehrfachbytes codiert werden. UTF-8 ist eine Kodierung mit variabler Länge: Je nach Zeichen kann die Kodierung eines Zeichens ein bis vier Bytes dauern. Einige Folgen von Bytes repräsentieren in UTF-8 kein Zeichen. Daher gibt es Folgen von Bytes, die keine gültigen UTF-8-Textdateien sind.
tr
beklagt sich, weil es auf eine solche Bytefolge gestoßen ist. Es wird erwartet, dass eine in UTF-8 codierte Textdatei angezeigt wird, es werden jedoch Binärdaten angezeigt, die nicht in UTF-8 gültig sind.
Ein Microsoft Word-Dokument ist keine Textdatei, sondern ein Textverarbeitungsdokument. Textverarbeitungsdokumentformate codieren nicht nur Text, sondern auch Formatierungen, eingebettete Bilder usw. Das Word-Format ist wie die meisten Textverarbeitungsformate keine Textdatei.
Sie können Textverarbeitungstools anweisen, Byte zu verarbeiten, indem Sie das Gebietsschema ändern . Wählen Sie speziell das Gebietsschema "C" aus, was im Grunde genommen "nichts Besonderes" bedeutet. In der Befehlszeile können Sie Gebietsschemaeinstellungen mit Umgebungsvariablen auswählen .
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
Dies wird keinen Fehler auslösen, aber es wird auch nichts Sinnvolles tun, da target-file
es sich immer noch um eine Binärdatei handelt, die wahrscheinlich nicht die meisten von Ihnen angegebenen Suchzeichenfolgen enthält.
Dies tr '\r' '\n'
ist im Übrigen kein sehr nützlicher Befehl, es sei denn, Sie haben Textdateien von Mac OS 9 oder älter übrig. \r
(Zeilenumbruch) war in Mac OS vor Mac OS X das Trennzeichen für \n
Zeilenumbrüche. Seit OS X ist das Trennzeichen für Zeilenumbrüche (Zeilenvorschub, Unix-Standard) und Textdateien enthalten keine Zeilenumbrüche. Windows verwendet die zweistellige Sequenz CR-LF, um Zeilenumbrüche darzustellen. tr -d '\r'
würde eine Windows-Textdatei in eine Unix / Linux / OSX-Textdatei konvertieren.
Wie können Sie also in einem Word-Dokument über die Befehlszeile suchen? Ein .docx
Word-Dokument ist eigentlich ein Zip-Archiv, das mehrere Dateien enthält, von denen sich die wichtigsten in XML befinden .
unzip -l Position-Paper-Final-Version.docx
Mac OS X enthält das Dienstprogramm zipgrep zum Durchsuchen von ZIP-Dateien.
zipgrep DeCSS Position-Paper-Final-Version.docx
Das Ergebnis wird nicht sehr gut lesbar sein, da XML-Dateien im docx-Format meist aus einer großen Zeile bestehen. Wenn Sie im Haupttext des Dokuments suchen möchten, extrahieren Sie die Datei word/document.xml
aus dem Archiv. Beachten Sie, dass diese Datei zusätzlich zum Dokumenttext ein XML-Markup enthält, das die Struktur des Dokuments darstellt. Sie können das XML-Markup ein wenig massieren sed
, um es in überschaubare Zeilen aufzuteilen.
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS