2009-01-02 13 views
11

Quiero hacer esto:findstr o grep que detecta automáticamente la codificación chararacter (UTF-16)

findstr /s /c:some-symbol * 

o el grep equivalente

grep -R some-symbol * 

pero necesito la utilidad para detectar automáticamente los archivos codificados en UTF -16 (y amigos) y búsquelos apropiadamente. Mis archivos incluso tienen la marca de orden de bytes FFEE en ellos, así que ni siquiera estoy buscando autodetección heroica.

¿Alguna sugerencia?


Me refiero a Windows Vista y XP.

+0

Son algunos de sus archivos en UTF-16 y algunos en ASCII, o qué? – Artelius

+0

Sí, algunos ASCII, algunos UTF-16. –

Respuesta

0

Según esto blog article por Damon Cortesi grep no funciona con archivos UTF-16, como descubriste. Sin embargo, se presenta esta solución alternativa:

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 

Esto es obviamente para Unix, no está seguro de lo que sería el equivalente en Windows. El autor de ese artículo también proporciona un script de shell para hacer lo anterior que puede encontrar en github here.

Esto greps solo los archivos que son UTF-16. También grep sus archivos ASCII de la manera normal.

0

No indicó en qué plataforma desea hacer esto.

En Windows, puede usar PowerGREP, que detecta automáticamente los archivos Unicode que comienzan con una marca de orden de bytes. (También hay una opción para detectar automáticamente los archivos sin una lista de materiales. La detección automática es muy fiable para UTF-8, pero limitado para UTF-16.)

4

Gracias por las sugerencias. Me refería a Windows Vista y XP.

También descubrí esta solución, el uso libre de Sysinternals strings.exe:

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

Strings.exe extractos de todas las cadenas que encuentra (a partir de binarios, pero funciona bien con archivos de texto también) y antepone cada resultado con un nombre de archivo y de colon , así que tenlo en cuenta en la expresión regular (o use cut u otro paso en la tubería). El -s lo hace realizar una extracción recursiva y -b simplemente suprime el mensaje de banner.

En última instancia, todavía estoy un poco sorprendido de que las utilidades principales de búsqueda Gnu grep y findstr no manejen codificaciones de caracteres Unicode de forma nativa.

+0

En sus entornos domésticos Unix, UTF-16 es mucho menos común, y los archivos generalmente están en UTF-8, que manejan muy bien. – bdonlan

+0

Quizás no sea tan bueno para extraer toda la línea, pero es perfecto para tratar de encontrar todos los archivos que contienen una cadena (que estoy tratando de hacer). Gracias. –

3

En Windows, también puede utilizar find.exe.

find /i /n "YourSearchString" *.* 

El único problema es que imprime nombres de archivos seguidos de coincidencias. Es posible filtrarlos por tuberías a findstr

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

Desafortunadamente, el comando de búsqueda no admite patrones coincidentes como findstr (comodines/expresiones regulares). –

1

Una solución consiste en convertir su UTF-16 a ASCII o ANSI

TYPE UTF-16.txt > ASCII.txt 

continuación, puede utilizar FINDSTR.

FINDSTR object ASCII.txt 
+0

... perdón, ¿qué? – Mehrdad

2
findstr /s /c:some-symbol * 

puede ser sustituida por la siguiente codificación de caracteres de comando conscientes:

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

Si agrega la respuesta de Venkateshwar a continuación, obtiene: para/r% f en (*) do @find/i/n "some-symbol" "% f" | findstr/i "algún-símbolo" que filtrará los nombres de los archivos. Lo encontré útil al buscar un conjunto de archivos que buscan "Fail". No me importaba en qué archivo aparecía, solo quería ver si algún archivo tenía "Fail" en él. – Eli

1

En las versiones posteriores de Windows se admite UTF-16 fuera de la caja. De lo contrario, intente cambiar la página de códigos activa por el comando chcp.

En mi caso cuando se utilizan solos findstr fallaba para UTF-16 archivos, sin embargo, trabajó con type:

type *.* | findstr /s /c:some-symbol 
Cuestiones relacionadas