¿Cómo se buscan archivos que contengan dos finales de línea (CRLF) con grep en Linux?

Quiero buscar archivos que contengan dos finales de línea con grep en Linux. Algo como esto:

grep -IUr --color '\r\n' . 

Lo anterior parece coincidir con el literal rn que no es lo que se desea.

El resultado de esto se canalizará a través de xargs a todos para convertir crlf a lf como este

 grep -IUrl --color '^M' . | xargs -ifile fromdos 'file' 

Use Ctrl + V , Ctrl + M para ingresar un carácter literal de retorno de carro en su cadena grep. Asi que:

 grep -IUr --color "^M" 

funcionará – si el ^M hay un CR literal que ingresa como sugerí.

Si desea la lista de archivos, también desea agregar la opción -l .

Explicación

  • -I archivos binarios
  • -U evita grep para quitar los caracteres CR. Por defecto, lo haría si decide que es un archivo de texto.
  • -r leer todos los archivos debajo de cada directorio recursivamente.

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. El uso de find para ejecutar el archivo en cada archivo en el árbol y luego grecking a través de “CRLF” le dará una línea de salida para cada archivo que tiene dos finales de línea de estilo:

 find . -not -type d -exec file "{}" ";" | grep CRLF 

le conseguirá algo así como:

 ./1/dos1.txt: ASCII text, with CRLF line terminators ./2/dos2.txt: ASCII text, with CRLF line terminators ./dos.txt: ASCII text, with CRLF line terminators 
 grep -IUlr $'\r' 

explainhell.com – grep -IUlr

Si su versión de grep admite la opción -P (–perl-regexp) , entonces

 grep -lUP '\r$' 

puede ser usado.

 # list files containing dos line endings (CRLF) cr="$(printf "\r")" # alternative to ctrl-V ctrl-M grep -Ilsr "${cr}$" . grep -Ilsr $'\r$' . # yet another & even shorter alternative 

La consulta fue búsqueda … Tengo un problema similar … alguien envió finales de líneas mixtas al control de versiones, así que ahora tenemos un grupo de archivos con terminaciones de línea 0x0d 0x0d 0x0a . Tenga en cuenta que

 grep -P '\x0d\x0a' 

encuentra todas las líneas, mientras que

 grep -P '\x0d\x0d\x0a' 

y

 grep -P '\x0d\x0d' 

no encuentra líneas por lo que puede haber algo “else” pasando dentro de grep cuando se trata de patrones de final de línea … desafortunadamente para mí!

Si, como yo, tu minimalista Unix no incluye detalles como el comando file , y las barras invertidas en tus expresiones grep simplemente no cooperan, prueba esto:

 $ for file in `find . -type f` ; do > dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d' > if [ $? -eq 0 ] ; then echo $file ; fi > done 

Las modificaciones que puede querer hacer a lo anterior incluyen:

  • ajustar el comando find para localizar solo los archivos que desea escanear
  • cambie el comando de volcado a od o cualquier utilidad de volcado de archivos que tenga
  • confirme que el comando de corte incluye un espacio inicial y posterior, así como solo el resultado de caracteres hexadecimales de la utilidad de volcado
  • limite la salida de volcado a los primeros 1000 caracteres más o menos para la eficiencia

Por ejemplo, algo como esto puede funcionar para ti usando od en lugar de volcado :

  od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$' 

Puede usar el comando de archivo en Unix. Le da la encoding de caracteres del archivo junto con los terminadores de línea.

 $ file myfile myfile: ISO-8859 text, with CRLF line terminators $ file myfile | grep -ow CRLF CRLF