¿Cómo eliminar espacios en blanco al final de la línea en archivos dados (más de uno)?

9

Estoy tan harto de espacios inútiles en los archivos fuente que incluso configuré vim para mostrarlos.

El problema es que a menudo (si no siempre) tengo que lidiar con espacios inútiles con los desarrolladores de mis compañeros.

Solo me gustaría escanear archivos fuente (dada una expresión regular) y eliminar espacios en blanco de todos los archivos dados.

He buscado en la web ("bash remove whitespace", etc.) pero no encontré algo útil.

Olivier Pons
fuente
2
¿Eliminar qué espacio en blanco? Sin un ejemplo de lo que desea eliminar, no veo cómo alguien podría ayudarlo. (Supongo que tr -d ' ' < file.foono es exactamente lo que estás buscando)
Mat
¿Cómo puede diferenciar programáticamente la diferencia entre espacios en blanco inútiles y espacios en blanco útiles? Por cierto: podría utilizar un bucle for y mv y sed y colapsar espacios en blanco;
bsd
También puede eliminar los espacios en blanco al guardar sus archivos en vim (ahorrándole la molestia de volver a ejecutar este comando después de editar algo): unix.stackexchange.com/questions/75430/…
Lucas

Respuestas:

8

Si por espacios en blanco inútiles te refieres a espacios en blanco al final de la línea, esto funcionará en los sistemas GNU:

find -name '*.c' -print0 | xargs -r0 sed -e 's/[[:blank:]]\+$//' -i

(reemplazar *.ccon lo que coincidan sus archivos de origen)

Dennis Kaarsemaker
fuente
He cambiado el título, muchas gracias por tu respuesta. Alguien ha votado en contra porque, tal vez pensó que era demasiado simple, que nadie debería hacer esa pregunta ;^). Gracias de nuevo.
Olivier Pons
1

Este es un problema recurrente!

perl -i -pe 's/\s+\n/\n/'  ./*.c

(esto también elimina ' \r\n')

Normalmente uso una versión un poco más compleja "nrs" (sin espacios redundantes):

#!/usr/bin/perl -pi
s/\h*(\r\n|\n|\r)/\n/g;                 ## normalize \n (DOS, MAC)
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//;  ## remove BOM !

instalarlo: chmod 755 nrs; cp nrs ~/bin; (o similar)

y use: nrs ./*.c

¡No lo uses en archivos binarios!

JJoao
fuente
0

Para evitar tocar archivos que ya están bien, con las herramientas de GNU:

grep -rlZ --binary-files=without-match --include='*.c' '\s$' . |
  xargs -r0 sed -i 's/\s+$//'
Stéphane Chazelas
fuente