2011-02-16 6 views
5

tengo una base de código que me está volviendo loco con los conflictos debido a las espacios en blanco. Me gustaría limpiarlo.Cómo limpiar una base de código, espacios en blanco, nuevas líneas, etc

que me gustaría:

  • Eliminar todo espacios en blanco
  • Retire todos los caracteres de nueva línea al final de los archivos
  • convertir todos los finales de línea a UNIX (dos2unix)
  • convertir todos espacios principales a pestañas, es decir, 4 espacios a pestañas.

  • Mientras ignorar el directorio .git.

Estoy en OSX Snow Leopard, y en zsh.

hasta ahora, que tengo:

sed -i "" 's/[ \t]*$//' **/*(.) 

que funciona muy bien, pero sed añade una nueva línea al final de cada archivo que toca, lo que no es bueno. No creo sed se puede parar de hacer esto, así que ¿cómo puedo eliminar estas nuevas líneas? Hay probablemente algo de magia awk para ser aplicado aquí.

(respuestas completas también son bienvenidos)

Respuesta

5

[EDIT: Se ha corregido el recorte de espacio en blanco]
[editar # 2: Tira de fuga líneas en blanco del final del archivo]

perl -i.bak -pe 'if (defined $x && /\S/) { print $x; $x = ""; } $x .= "\n" x chomp; s/\s*?$//; 1 while s/^(\t*) /$1\t/; if (eof) { print "\n"; $x = ""; }' **/*(.) 

Este tiras arrastrando líneas en blanco del archivo, pero deja exactamente un \n al final del archivo. La mayoría de las herramientas esperan esto, y no aparecerá como una línea en blanco en la mayoría de los editores. Sin embargo, si usted quiere despojar a esa misma última \n, simplemente eliminar la parte print "\n"; del comando.

El comando funciona "guardando" \n caracteres hasta que se vea una línea que contenga un carácter que no esté en blanco; a continuación, los imprime todos antes de procesar esa línea.

Retire .bak para evitar la creación de copias de seguridad de los archivos originales (uso bajo su propio riesgo!)

\s*? concuerda con cero o más espacios en blanco caracteres no avidez, incluyendo \r, que es el primer carácter de la línea DOS \r\n -sintaxis de ruptura En Perl, $ partidos ya sea al final de la línea, o inmediatamente antes de una final \n, por lo que combinado con el hecho de que *? partidos no avidez (tratando un partido 0-anchura primera, a continuación, un partido de 1-anchura y así sucesivamente) hace lo correcto.

1 while s/^(\t*) /$1\t/ es simplemente un bucle que reemplaza repetidamente las líneas que comienzan con cualquier número de pestañas seguidas de 4 espacios con una pestaña más que la que había, hasta que esto ya no sea posible.Por lo que funciona incluso si algunas líneas se han convertido parcialmente a las pestañas ya, siempre y cuando todos \t personajes comienzan en una columna divisible por 4.

No he visto la sintaxis **/*(.) antes, es de suponer que es una extensión zsh? Si funcionó con sed, funcionará con perl.

+0

**/* (.) Es un glob zsh. es solo otra forma de realizar una acción en muchos archivos. para que el enunciado perl se ejecute una vez por cada archivo que encuentre. – jhogendorn

+1

Además, esto no funciona? Elimina todos los espacios en blanco, nuevas líneas, todo. – jhogendorn

+0

¡Vaya! Solucionado ahora y probado. –

Cuestiones relacionadas