[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
.
**/* (.) 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
Además, esto no funciona? Elimina todos los espacios en blanco, nuevas líneas, todo. – jhogendorn
¡Vaya! Solucionado ahora y probado. –