¿Cómo reemplazar todas las pestañas de cada archivo en una rama del sistema de archivos con 2 espacios cada una?

10

Codifico Scala y su convención es usar espacios dobles por nivel para la identificación. Pero el uso de diferentes editores hace que mis fuentes se llenen de una mezcla de espacios y pestañas.

Me gustaría refactorizar todos los archivos (archivos * .scala, en realidad, pero no es necesario especificarlo) (en un directorio dado y todas las ramas FS subyacentes (recursivamente)) automáticamente, reemplazando todas las pestañas con espacios dobles. Creo que hay una manera fácil y hermosa de hacer esto con las herramientas clásicas de Unix / GNU, pero me falta experiencia en esta área. ¿Serías tan amable de ayudarme?

Ivan
fuente

Respuestas:

9

Recursivamente, usando expand(que fue hecho para este propósito):find . -type f -name '*.scala' -exec bash -c 'for x in "$@"; do mv "$x"{,.bak} && expand -t 2 "$x.bak" > "$x" && rm "$x.bak"; done' {} +

Lo haría con sedo perl(ver la respuesta de Sardathrion) porque admiten la edición en línea, pero de expandtodos modos quería mencionar a los buenos .

EDITAR: Eso sería find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +

janmoesen
fuente
La primera variante funciona como se esperaba. La segunda variante (perl) reemplaza una pestaña con solo un espacio en lugar de dos.
Ivan
Sí, lo siento: fue un error de formato. El código fuente dice dos espacios, pero el HTML representado solo muestra uno.
Janmoesen
10

Esto debería hacerlo:

find . -type f -name '*.scala$' -exec sed -i 's/\t/  /g' {} +

Nota: esto no se ha probado.

Sardathrion - contra el abuso SE
fuente
1
Esto aún no es recursivo. Puede usar findo un shell que admita la **/*.scalarecursividad.
Janmoesen
Editado para agregar comportamiento recursivo ...
Sardathrion - contra el abuso de SE
Por favor no promocione find | xargs. Use en su find -execlugar, como mencioné en mi respuesta. Más fácil y seguro.
Janmoesen
Intenté esto, no hay resultado. El comando regresa inmediatamente y nada cambia dentro de los archivos.
Ivan
esto no se prueba, pero lo esencial funcionará.
Sardathrion - contra el abuso SE