Ich bin brandneu in UNIX und benutze Kirk McElhearns "The Mac OS X Command Line", um mir einige Befehle beizubringen.
Ich versuche, zu verwenden tr
und grep
damit ich nach Textzeichenfolgen in einem regulären MS-Office Word-Dokument suchen kann.
$ tr '\r' '\n' < target-file | grep search-string
Aber alles, was es zurückgibt, ist:
Illegal byte sequence.
robomechanoid:Position-Paper-Final-Draft robertjralph$ tr '\r' '\n' < Position-Paper-Final-Version.docx | grep DeCSS
tr: Illegal byte sequence
robomechanoid:Position-Paper-Final-Draft robertjralph$
Ich habe tatsächlich die gleiche Zeile in einem Skript ausgeführt, das ich erstellt habe, vi
und es führt die Suche korrekt aus.
text-processing
grep
character-encoding
binary
tr
user74886
quelle
quelle
Antworten:
grep
ist ein Textverarbeitungswerkzeug. Es erwartet, dass ihre Eingabe Textdateien sind . Es scheint, dass das gleiche gilt fürtr
MacOS (obwohltr
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 .
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 .Mac OS X enthält das Dienstprogramm zipgrep zum Durchsuchen von ZIP-Dateien.
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 massierensed
, um es in überschaubare Zeilen aufzuteilen.quelle
xml_pp
sie in einem Paketxml-twig-tools
unter Debian Gnu + Linux verwenden (ich kenne keinen Mac).tr
Erwarten [...] Sie, dass ihre Eingabe Textdateien sind."; In der POSIX-Spezifikation heißt es eindeutig: "Die Standardeingabe kann ein beliebiger Dateityp sein." . Bitte korrigieren Sie Ihre Antwort.tr
ist angeblich Binäreingang zu verarbeiten (insbesondere es zu null Prozess angenommen hat , Bytes korrekt). POSIX gibt jedoch nicht eindeutig an, wie mit Eingaben umgegangen werden soll, die keine Zeichenfolge sind. (Wenn ich ein Implementierer wäre, würde ich ungültige Byte-Sequenzen unverändert durchgehen (oder sie mit entfernen-s
) und einen Fehler beim Standard-Komitee melden.) Offensichtlich beschwert sich macOS's tr über sie.Ich nehme an, dass Ihr Charmap aus den Gebietsschemas UTF-8 ist, so dass Sie Probleme mit Binärdateien haben. Wechseln Sie einfach zum Gebietsschema C:
quelle
LC_ALL=C ( tr '\r' '\n' < target-file | grep search-string )
. Das Dokument ist jedoch nicht C-lokal. Ist utf16 und gezippt und komplex und jedermanns Vermutung. Ich würde so aussehen, als ob ich ein Tool verwende, das es in ein anderes Format konvertieren kann, das Sie zB html oder odt verarbeiten können (odt ist ebenfalls gezippt, aber gut definiert und einfach zu interpretieren).strings
Befehl Klartext gibt.( export LC_ALL=C; tr '\r' '\n' < target-file | grep search-string; )
sollte funktionieren.strings
hat Superkräfte: Es kann Dateien lesen, die nicht nur aus UTF-8 oder ASCII-Text bestehen.()
mir leid wegen der Sache, von der ich dachte, dass sie funktionieren würde, danke an @ vinc17 für eine Lösung.