Quiero buscar archivos que contengan terminaciones de dos líneas con grep en Linux. Algo como esto:
grep -IUr --color '\r\n' .
Lo anterior parece coincidir con literal, rn
que no es lo que se desea.
La salida de esto se canalizará a través de xargs en todos para convertir crlf a lf de esta manera
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
con-ic
interruptor. Para archivos LF puede buscar con unix2dos-ic
. No modifica los archivos. Solo informe.cat -v somefile.txt
; aparecen como^M
Respuestas:
Use Ctrl+ V, Ctrl+ Mpara ingresar un carácter literal de retorno de carro en su cadena grep. Entonces:
funcionará, si
^M
hay un CR literal que ingresas como sugerí.Si desea la lista de archivos, también desea agregar la
-l
opción.Explicación
-I
ignorar archivos binarios-U
evita que grep elimine los caracteres CR. Por defecto lo haría si decide que es un archivo de texto.-r
lea todos los archivos de cada directorio de forma recursiva.fuente
printf '\r'
grep $(printf '\r')
. Pero para la mayoría de los usos prácticos que involucran bash, me quedaría con$'\r'
.-U
solo es relevante para Windows (o cygwin), pero es crítica allí. En Windows, el comando no funcionará sin él.-I
? Según el manual, me parece que los archivos binarios se consideran no coincidentes. ¿No debería la combinación de-I
y-U
(que impone el tipo binario) dar como resultado que todos los archivos se consideren no coincidentes?grep probablemente no es la herramienta que desea para esto. Imprimirá una línea para cada línea coincidente en cada archivo. A menos que desee, por ejemplo, ejecutar todos 10 veces en un archivo de 10 líneas, grep no es la mejor manera de hacerlo. Usando find para ejecutar el archivo en cada archivo en el árbol y luego pasando por eso para "CRLF" obtendrá una línea de salida para cada archivo que tiene terminaciones de línea de dos estilos:
te dará algo como:
fuente
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
programa. Esto es muy frágil. Por ejemplo (solo un): no funciona con archivos XML, losfile
informes ,XML document text
independientemente del tipo de líneas nuevas.-m /dev/null
en mifind (GNU findutils) 4.4.2
(Ubuntu 12.04).find . -type f | xargs file | grep CRLF
explicahell.com - grep -IUlr
fuente
Si su versión de grep admite la opción -P (--perl-regexp) , entonces
puede ser usado.
fuente
fuente
La consulta fue buscar ... Tengo un problema similar ... alguien envió terminaciones de línea mixtas en el control de versión, por lo que ahora tenemos un montón de archivos con
0x0d
0x0d
0x0a
terminaciones de línea. Tenga en cuenta queencuentra todas las líneas, mientras que
y
no encuentra líneas, por lo que puede haber algo "más" dentro de grep cuando se trata de patrones de finalización de línea ... ¡desafortunadamente para mí!
fuente
Puede usar el comando de archivo en unix. Le proporciona la codificación de caracteres del archivo junto con los terminadores de línea.
fuente
Si, como yo, su unix minimalista no incluye detalles como el comando de archivo , y las barras invertidas en sus expresiones grep simplemente no cooperan, intente esto:
Las modificaciones que puede hacer a lo anterior incluyen:
Por ejemplo, algo como esto puede funcionar para usted usando od en lugar de dump :
fuente
dos2unix
tiene una opción de información de archivo que se puede usar para mostrar los archivos que se convertirían:Para hacerlo de forma recursiva, puede usar
bash
laglobstar
opción, que para el shell actual está habilitada conshopt -s globstar
:Alternativamente, puede usar
find
para eso:fuente