2009-01-02 8 views
11

Ich möchte, dies tun erkennt automatisch:findstr oder grep, die chararacter Codierung (UTF-16)

findstr /s /c:some-symbol * 

oder grep Äquivalent

grep -R some-symbol * 

aber ich brauche die Dienstprogramm-Dateien in UTF codiert automatisch zu erkennen -16 (und Freunde) und suchen sie entsprechend. Meine Dateien haben auch die Byte-Reihenfolge Marke FFEE in ihnen so bin ich nicht einmal für heroische automatische Erkennung suchen.

Irgendwelche Vorschläge?


Ich beziehe mich auf Windows Vista und XP.

+0

Sind einige Ihrer Dateien in UTF-16 und einig in ASCII, oder was? – Artelius

+0

Ja, einige ASCII, einige UTF-16. –

Antwort

0

Nach dieser blog article von Damon Cortesi grep nicht mit UTF-16-Dateien funktioniert, wie Sie herausgefunden haben. Aber es stellt diese Behelfslösung:

for f in `find . -type f | xargs -I {} file {} | grep UTF-16 | cut -f1 -d\:` 
     do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f ${GREP_FOR} 
done 

Dies ist natürlich für Unix, nicht sicher, was das Äquivalent unter Windows wäre. Der Autor dieses Artikels stellt auch ein Shell-Skript, um die oben genannten zu tun, die Sie auf Github here finden.

Diese greps nur Dateien, die UTF-16 sind. Sie würden Ihre ASCII-Dateien auch auf die normale Weise weitergeben.

0

Sie sagen nicht, welche Plattform Sie diese auf tun wollen.

Unter Windows können Sie PowerGREP verwenden, die Unicode-Dateien erkennt, die mit einer Byte-Reihenfolge beginnen. (Es gibt auch eine Option zur automatischen Erkennung von Dateien ohne BOM. Die automatische Erkennung ist sehr zuverlässig für UTF-8, aber begrenzt für UTF-16.)

4

Vielen Dank für die Vorschläge. Ich habe mich auf Windows Vista und XP bezogen.

Ich entdeckte auch diese Abhilfe, frei Sysinternals strings.exe mit:

C:\> strings -s -b dir_tree_to_search | grep regexp 

Strings.exe Extrakte alle Saiten es findet (von Binärdateien, sondern funktioniert mit Text auch Dateien) und prepends jedes Ergebnis mit einem Dateinamen und Kolon , also berücksichtige das im regexp (oder benutze cut oder einen anderen Schritt in der Pipeline). Die -s macht es eine rekursive Extraktion tun und -b unterdrückt nur die Banner-Nachricht.

Letztendlich bin ich immer noch irgendwie überrascht, dass das Flaggschiff Suchdienstprogramme Gnu grep und findstr nicht Unicode-Zeichenkodierungen nativ behandeln.

+0

In ihren Heimunix-Umgebungen ist UTF-16 viel seltener, und Dateien sind in der Regel in UTF-8, die sie gut behandeln. – bdonlan

+0

Vielleicht nicht so toll zum Extrahieren der ganzen Zeile, aber perfekt für den Versuch, alle Dateien zu finden, die eine Zeichenfolge enthalten (was ich versuche). Vielen Dank. –

3

Unter Windows können Sie auch find.exe verwenden.

Das einzige Problem ist, druckt Dateinamen gefolgt von Übereinstimmungen. Sie können diese nach Rohr filtern

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString" 
+0

Leider unterstützt der Befehl find keine passenden Muster wie findstr (Wildcards/reguläre Ausdrücke). –

1

Eine Abhilfe findstr ist Ihr UTF-16 konvertiert in ASCII oder

ANSI
TYPE UTF-16.txt > ASCII.txt 

Dann können Sie FINDSTR verwenden.

for /r %f in (*) do @find /i /n "some-symbol" "%f" 
+0

... Verzeihung, was? – Mehrdad

2
findstr /s /c:some-symbol * 

kann mit dem folgende Zeichen bewusst Befehl kodiert, ersetzt werden. Falls nicht, versuchen Sie, die aktive Codepage durch den Befehl chcp zu ändern.

In meinem Fall, wenn findstr allein mit versagen für UTF-16-Dateien, aber es funktioniert mit type:

type *.* | findstr /s /c:some-symbol 
+0

Wenn Sie Venkateshwars Antwort unten hinzufügen, erhalten Sie: für/r% f in (*) do @find/i/n "irgendeines Symbol" "% f" | findstr/i "einige-symbol" die filenamen ausfiltern wird. Ich fand das nützlich, wenn ich eine Reihe von Dateien suche, die nach "Fail" suchen. Es war mir egal, in welcher Datei es erschien, ich wollte nur sehen, ob irgendeine Datei "Fail" enthielt. – Eli

1

In höheren Versionen von Windows, UTF-16 wird unterstützt out-of-box:

FINDSTR object ASCII.txt