Yo uso Linux Hay un molesto ^ M (retorno de carro de Windows) en algún lugar oculto en miles de archivos de configuración, y tengo que encontrarlo, porque hace que el servidor falle.
¿Cómo encuentro ^ M entre una jerarquía de directorios llena de archivos de configuración?
Creo que no puedo ingresar ^ M en la línea de comando bash. Pero lo tengo en un archivo de texto que llamé m.txt
Respuestas:
Úselo
-r
para búsqueda recursiva y$''
para escape estilo c en Bash.Más aún, si está seguro de que es un archivo de texto, entonces debería ser seguro ejecutarlo
para eliminar todo
\r
en un archivo.Si usa GNU
sed
,-i
puede realizar la edición en el lugar, por lo que no necesitará escribir de nuevo:fuente
$'\r'
.$'
leer el primer hit en la página de manualbash(1)
, básicamente, puede verlo como si estuviera escribiendo una cadena literal C. En cuanto alcommand < filename
uso de<
o>
se llama redirección , esta es la primera vez que veo a alguien llamarlo mayor expresión . BuscarREDIRECTION
enbash(1)
.Cuando lo intenté, me di cuenta de que funcionaba, pero las líneas se imprimían en blanco. Agregue la opción:
Si tiene este problema, creo que son los caracteres de escape para resaltar el color que interfieren con el
\r
personaje.fuente
Si su servidor no tiene un shell bash, una alternativa es usar la
-f
opcióngrep
, en combinación con un archivo preparado que contenga\r
.Para crear el archivo:
Para hacer realmente la búsqueda
o puedes ser un poco vago y simplemente escribir *,
La opción on se usa para especificar un archivo que contiene patrones para que coincidan, uno por línea. En este caso solo hay un patrón.
-f filename
grep
fuente
Para usar grep en los caracteres de fin de línea, supongo que debe decirle a grep que el archivo es binario.
-l (letra L) es para imprimir solo el nombre del archivo
-P es para regexp perl (entonces \ x0d se transforma a \ r o ^ M)
fuente
Si entiendo su pregunta correctamente, lo que realmente quiere es normalizar todas las terminaciones de línea al
\x0a
estándar Unix LF ( ). Eso no es lo mismo que simplemente eliminar ciegamente los CR (\xod
).Si tiene algunos archivos Mac que usan solo CR para líneas nuevas, destruirá esos archivos. (Sí, se supone que las Mac usan LF desde hace casi 20 años, pero todavía hay (en 2019) muchas aplicaciones de Mac que usan solo CR).
Puede usar el
\R
escape de salto de línea de Perl para reemplazar cualquier tipo de línea nueva con\n
.Esto reemplazaría en el lugar cualquier tipo de salto de línea con
\n
in$your_file
, manteniendo una copia de seguridad del archivo original${your_file}.bak
.fuente
Si está en una Mac y usa homebrew , puede hacer:
para eliminar todos los retornos de carro de Windows de file.txt
Para volver a los retornos de carro de Windows,
fuente
En el estilo de expresión regular, varias líneas nuevas:
Windows (CR LF)
\r\n
Unix (LF)
\n
Como la
\r\n
secuencia es bastante única, ¿creo que deberías poder buscarla de esa manera?Para empeorar las cosas, Macs solía tener '\ r' en lugar de nueva línea. No puedo verificar esto, pero no creo que las generaciones de MacOSX lo hagan más.
Macs más antiguos (CR)
\r
fuente
grep "\r\n" *
no da ningún resultado. Ningún resultado paraegrep -e "\r\n" *
nigrep -E "\r\n" *
\r
mi mal. Una nueva línea de Windows completa es de hecho\r\n
o CRLFSiguiendo las respuestas anteriores, el método 'tr' es bueno:
533 $ if [[-n "
tr -cd "\r" <~/.bashrc
"]]; entonces echo "DOS"; si no echo "UNIX"; fiUNIX
534 $ if [[-n "
tr -cd "\r" <dosfile.txt
"]]; entonces echo "DOS"; si no echo "UNIX"; fiDOS
fuente