Jestem zupełnie nowy w systemie UNIX i używam „Linii poleceń Mac OS X” Kirka McElhearna, aby nauczyć się kilku poleceń.
Ja próbuje użyć tr
i grep
tak, że mogę szukać ciągów tekstowych w regularnych MS-Office Word dokument.
$ tr '\r' '\n' < target-file | grep search-string
Ale wszystko, co zwraca, to:
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$
Właściwie uruchomiłem tę samą linię na skrypcie, który utworzyłem vi
i poprawnie wyszukuje.
text-processing
grep
character-encoding
binary
tr
użytkownik74886
źródło
źródło
Odpowiedzi:
grep
to narzędzie do przetwarzania tekstu. Oczekuje, że ich dane wejściowe będą plikami tekstowymi . Wygląda na to, że to samo dotyczytr
systemu macOS (chociażtr
ma obsługiwać pliki binarne).Komputery przechowują dane jako sekwencje bajtów . Tekst to ciąg znaków. Istnieje kilka sposobów kodowania znaków jako bajtów, zwanych kodowaniem znaków . De facto standardowym kodowaniem znaków w większości świata, szczególnie w OSX, jest UTF-8 , który jest kodowaniem zestawu znaków Unicode . Istnieje tylko 256 możliwych bajtów, ale ponad milion możliwych znaków Unicode, więc większość znaków jest kodowana jako wiele bajtów. UTF-8 jest kodowaniem o zmiennej długości: w zależności od znaku kodowanie znaku może zająć od jednego do czterech bajtów. Niektóre sekwencje bajtów nie reprezentują żadnego znaku w UTF-8. Dlatego istnieją sekwencje bajtów, które nie są poprawnymi plikami tekstowymi UTF-8.
tr
narzeka, ponieważ napotkał taką sekwencję bajtów. Oczekuje pliku tekstowego zakodowanego w UTF-8, ale widzi dane binarne, które nie są poprawne UTF-8.Dokument Microsoft Word nie jest plikiem tekstowym: jest to dokument edytora tekstu. Formaty dokumentów przetwarzania tekstu kodują nie tylko tekst, ale także formatowanie, osadzone obrazy itp. Format Word, podobnie jak większość formatów przetwarzania tekstu, nie jest plikiem tekstowym.
Możesz poinstruować narzędzia do przetwarzania tekstu, aby działały na bajtach, zmieniając ustawienia regionalne . W szczególności wybierz lokalizację „C”, co w zasadzie oznacza „nic szczególnego”. W wierszu polecenia możesz wybrać ustawienia regionalne ze zmiennymi środowiskowymi .
Nie spowoduje to wyemitowania błędu, ale nie przyniesie też nic pożytecznego, ponieważ
target-file
nadal jest plikiem binarnym, który prawdopodobnie nie zawiera większości podanych ciągów wyszukiwania.Nawiasem mówiąc,
tr '\r' '\n'
nie jest to bardzo przydatne polecenie, chyba że masz pliki tekstowe z systemu Mac OS 9 lub starszego.\r
(powrót karetki) był separatorem nowej linii w Mac OS przed Mac OS X. Od OSX separatorem nowej linii jest\n
(przesunięcie wiersza, standard unix), a pliki tekstowe nie zawierają znaków powrotu karetki. Windows używa dwuznakowej sekwencji CR-LF do reprezentowania podziałów linii;tr -d '\r'
przekonwertowałby plik tekstowy Windows na plik tekstowy Unix / Linux / OSX.Jak więc szukać w dokumencie Word z wiersza poleceń? Dokument
.docx
Word jest w rzeczywistości archiwum zip zawierającym kilka plików, z których główne są w formacie XML .Mac OS X zawiera narzędzie zipgrep do przeszukiwania plików zip.
Wynik nie będzie bardzo czytelny, ponieważ pliki XML w formacie docx składają się głównie z jednej ogromnej linii. Jeśli chcesz przeszukać główny tekst dokumentu, wypakuj plik
word/document.xml
z archiwum. Zauważ, że oprócz tekstu dokumentu, plik ten zawiera znaczniki XML, które reprezentują strukturę dokumentu. Możesz nieco masować znaczniki XML,sed
aby podzielić je na łatwe do zarządzania linie.źródło
xml_pp
w pakieciexml-twig-tools
na Debian Gnu + Linux (nie znam Maca).tr
[...] oczekują, że ich dane wejściowe będą plikami tekstowymi.”; podczas gdy specyfikacja POSIX wyraźnie stwierdza „Standardowym wejściem może być dowolny typ pliku”. . Popraw swoją odpowiedź.tr
to powinien przetwarzać wejście binarne (w szczególności, to ma proces NULL bajty poprawnie). POSIX nie określa jednak jasno, w jaki sposób ma postępować z danymi wejściowymi, które nie są ciągiem znaków. (Gdybym był implementatorem, przekazywałbym niepoprawne sekwencje bajtów przez niezmodyfikowane (lub usunąłem je-s
) i zgłaszałem wadę standardowej komisji.) Najwyraźniej tr macOS narzeka na nie.Podejrzewam, że twój charmap z ustawień regionalnych to UTF-8, więc będziesz mieć problemy z plikami binarnymi. Po prostu przejdź do ustawień regionalnych C:
źródło
LC_ALL=C ( tr '\r' '\n' < target-file | grep search-string )
. Jednak docx nie jest lokalny w języku C. Jest utf16 i jest skompresowany i złożony i nikt nie zgadnie. Chciałbym wyglądać jak narzędzie, które może przekonwertować go na inny format, który można przetwarzać np. HTML lub ODT (ODT jest również skompresowany, ale dobrze zdefiniowany i łatwy do interpretacji).strings
polecenie podaje czysty tekst.( export LC_ALL=C; tr '\r' '\n' < target-file | grep search-string; )
powinien działać.strings
ma super moce: potrafi czytać pliki, które nie są tylko utf-8 lub tekstem ASCII.()
rzecz, która moim zdaniem zadziała, dzięki @ vinc17 za naprawę.