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

StackOverflow https://stackoverflow.com/questions/73833

  •  09-06-2019
  •  | 
  •  

Pregunta

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

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

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

La salida de esto se canalizará a través de xargs hacia todos para convertir crlf en lf de esta manera

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
¿Fue útil?

Solución

Usar Control+V, Control+METRO para ingresar un carácter literal de retorno de carro en su cadena grep.Entonces:

grep -IUr --color "^M"

funcionará - si el ^M hay un CR literal que ingresas como sugerí.

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

Explicación

  • -I ignorar archivos binarios
  • -U evita que grep elimine los caracteres CR.De forma predeterminada lo haría si decide que es un archivo de texto.
  • -r lea todos los archivos en cada directorio de forma recursiva.

Otros consejos

grep probablemente no sea la herramienta que desea para esto.Imprimirá una línea por cada línea coincidente en cada archivo.A menos que desee, digamos, ejecutar todos 10 veces en un archivo de 10 líneas, grep no es la mejor manera de hacerlo.Usar buscar para ejecutar archivos en cada archivo en el árbol y luego buscar "CRLF" le dará una línea de salida para cada archivo que tiene terminaciones de línea de estilo DOS:

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

obtendrá 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

Si su versión de grep es compatible -P (--perl-expreg.reg) opción, 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 buscar...Tengo un problema similar...Alguien envió terminaciones de línea mixta al control de la versión, así que ahora tenemos un montón de archivos con 0x0d 0x0d 0x0a finales de línea.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" que sucede dentro de Grep cuando se trata de patrones de finalización de línea ...¡desafortunadamente para mí!

Si, como yo, tu Unix minimalista no incluye sutilezas como el archivo comando y barras invertidas en su grep las expresiones 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 quizás desee realizar a lo anterior incluyen:

  • modificar el encontrar comando para localizar sólo los archivos que desea escanear
  • cambiar el vertedero comando para sobredosis o cualquier utilidad de volcado de archivos que tengas
  • confirmar que el cortar El comando incluye un espacio inicial y final, así como solo el carácter hexadecimal resultante del vertedero utilidad
  • limitar el vertedero salida a los primeros 1000 caracteres aproximadamente para mayor eficiencia

Por ejemplo, algo como esto puede funcionar para usted usando sobredosis en lugar de vertedero:

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

Puedes usar el comando de archivo en Unix.Le proporciona la codificación de caracteres del archivo junto con terminadores de línea.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top