varios una texto test solo siguientes regulares regresará que por patrones palabras líneas los linea expresiones egrep cuál consola con comiencen comandos buscar archivos linux bash grep newline

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



grep varios patrones (8)

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í!

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''


Puede usar el comando de archivo en Unix. Le da la codificación 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


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

grep -lUP ''/r$''

puede ser usado.


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$''


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


# 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