2009-01-02 7 views
11

Je veux faire:findstr ou grep qui détecte automatiquement chararacter encodage (UTF-16)

findstr /s /c:some-symbol * 

ou grep équivalent

grep -R some-symbol * 

mais je besoin de l'utilitaire pour détecter automatiquement les fichiers encodés en UTF -16 (et amis) et les chercher de manière appropriée. Mes fichiers ont même la marque d'ordre octet FFEE dans eux, donc je ne cherche même pas autodétection héroïque.

Des suggestions?


Je me réfère à Windows Vista et XP.

+0

-ce que certains de vos fichiers en UTF-16 et certains en ASCII, ou quoi? – Artelius

+0

Oui, certains ASCII, certains UTF-16. –

Répondre

0

Selon ce blog article par Damon Cortesi grep ne fonctionne pas avec les fichiers UTF-16, comme vous l'avez découvert. Cependant, il présente cette solution:

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 

Ceci est évidemment pour Unix, pas sûr de ce que l'équivalent sur Windows serait. L'auteur de cet article fournit également un shell-script pour faire ce qui précède que vous pouvez trouver sur github here.

Ceci ne greps que les fichiers UTF-16. Vous pouvez également grep vos fichiers ASCII de la manière normale.

0

Vous n'avez pas indiqué sur quelle plate-forme vous souhaitez effectuer cette opération.

Sous Windows, vous pouvez utiliser PowerGREP, qui détecte automatiquement les fichiers Unicode commençant par un repère d'octet. (Il y a aussi une option pour détecter automatiquement les fichiers sans nomenclature L'auto-détection est très fiable pour UTF-8, mais limitée pour UTF-16.)

4

Merci pour vos suggestions. Je parlais de Windows Vista et XP.

J'ai aussi découvert cette solution de contournement, en utilisant Sysinternals strings.exe gratuit:

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

Strings.exe extraits toutes les chaînes qu'il trouve (à partir des binaires, mais fonctionne bien avec les fichiers texte trop) et prepends chaque résultat avec un nom de fichier et du côlon , alors prenez cela en compte dans l'expression rationnelle (ou utilisez une coupure ou une autre étape dans le pipeline). Le -s le fait faire une extraction récursive et -b supprime juste le message de bannière. En fin de compte, je suis encore un peu surpris que les utilitaires de recherche phare Gnu grep et findstr ne gèrent pas les codages de caractères Unicode nativement.

+0

Sur leurs environnements Unix domestiques, UTF-16 est beaucoup moins commun, et les fichiers sont généralement en UTF-8, qu'ils gèrent très bien. – bdonlan

+0

Peut-être pas si génial pour extraire toute la ligne, mais parfait pour essayer de trouver tous les fichiers contenant une chaîne (que j'essaie de faire). Merci. –

3

Sous Windows, vous pouvez également utiliser find.exe.

find /i /n "YourSearchString" *.* 

Le seul problème est l'impression de noms de fichiers suivis de correspondances. Vous pouvez les filtrer par une canalisation à findstr

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

Malheureusement, la commande find ne prend pas en charge les modèles correspondants tels que findstr (caractères génériques/expressions régulières). –

1

Une solution consiste à convertir votre UTF-16 en ASCII ou ANSI

TYPE UTF-16.txt > ASCII.txt 

Ensuite, vous pouvez utiliser FINDSTR.

FINDSTR object ASCII.txt 
+0

... pardon, quoi? – Mehrdad

2
findstr /s /c:some-symbol * 

peut être remplacé par le caractère suivant encodant commande au courant:

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

Si vous ajoutez la réponse de Venkateshwar ci-dessous, vous obtenez: pour/r% f in (*) do @find/i/n "some-symbol" "% f" | findstr/i "un-symbole" qui filtrera les noms de fichiers. J'ai trouvé cela utile lors de la recherche d'un ensemble de fichiers à la recherche de "Fail". Je me fichais du fichier dans lequel il apparaissait, je voulais juste voir si un fichier contenait "Fail". – Eli

1

Dans les versions supérieures de Windows, UTF-16 est pris en charge hors de la boîte. Sinon, essayez de changer la page de code active par la commande chcp.

Dans mon cas lors de l'utilisation findstr seul échouait pour les fichiers UTF-16, mais il a travaillé avec type:

type *.* | findstr /s /c:some-symbol 
Questions connexes