¿Cómo se buscan archivos que contienen finales de línea DOS (CRLF) con grep en Linux?
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'
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
grep -IUlr $'\r'
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