it-swarm-es.tech

¿Cómo buscar archivos con terminaciones de dos líneas (CRLF) con grep en Linux?

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 para rn literal, 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 como este

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

Utilizar Ctrl+VCtrl+M para ingresar un carácter de retorno de carro literal 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 ignora los archivos binarios
  • -U evita que grep elimine los caracteres CR. Por defecto lo haría si decide que es un archivo de texto.
  • -r lee todos los archivos de cada directorio de forma recursiva.
108
pjz

grep probablemente no sea la herramienta que quieres para esto. Imprimirá una línea para cada línea coincidente en cada archivo. A menos que quiera, digamos, ejecutar todos 10 veces en un archivo de 10 líneas, grep no es la mejor manera de hacerlo. Al usar Buscar para ejecutar el archivo en cada archivo en el árbol, a continuación, grepping a través de eso para "CRLF" obtendrá 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

te conseguirá algo 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
140
Thomee
48
Steven Penny

Si su versión de grep es compatible con -P (--Perl-regexp) option, entonces

grep -lUP '\r$'

puede ser usado.

15
Linulin
# 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
6
yabt

La consulta fue de búsqueda ... Tengo un problema similar ... alguien envió finales de línea mixtos en el control de versión, por lo que ahora tenemos un montón de archivos con finales de línea 0x0d0x0d0x0a 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 "más" dentro de grep cuando se trata de patrones de final de línea ... ¡desafortunadamente para mí!

3
Peter Y

Puedes usar el comando de archivo en unix. Le proporciona 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  
1

Si, como yo, su Unix minimalista no incluye detalles como el file command, y las barras invertidas en su grep expresiones simplemente no cooperan, intente 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 desee hacer a lo anterior incluyen:

  • Modifique el comando find para localizar solo los archivos que desea escanear
  • cambie el comando dump a od o la utilidad de volcado de archivos que tenga
  • confirme que el comando cut incluye un espacio inicial y uno final, así como solo la salida de caracteres hexadecimales del archivo dump utility
  • limite el volcado salida a los primeros 1000 caracteres más o menos por eficiencia

Por ejemplo, algo como esto puede funcionar para usted usando od en lugar de dump :

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