Come sostituire tutte le schede di ciascun file in un ramo del file system con 2 spazi ciascuna?


10

Codifico Scala e la sua convenzione è di usare doppi spazi per livello per l'identificazione. Ma usare editor diversi rende le mie fonti piene di un mix di spazi e schede.

Vorrei refactificare tutti i file (file * .scala, in realtà, ma non è necessario specificarlo) (in una determinata directory e tutti i rami FS sottostanti (ricorsivamente)), sostituendo tutte le schede con doppi spazi. Credo che ci sia un modo semplice e bello per farlo con i classici strumenti Unix / GNU, ma non ho alcuna esperienza in questo campo. Saresti così gentile da aiutarmi?

Risposte:


9

Ricorsivamente, usando expand(che è stato fatto per questo scopo):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 farei con sedo perl(vedi la risposta di Sardathrion) perché supportano l'editing in linea, ma volevo menzionare expandcomunque il buon vecchio .

EDIT: Sarebbe find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +


La prima variante funziona come previsto. La seconda variante (perl) sostituisce una scheda con solo uno spazio anziché due.
Ivan,

Sì, scusa: è stato un errore di formattazione. Il codice sorgente indica due spazi, ma l'HTML renderizzato ne mostra solo uno.
Janmoesen,

10

Questo dovrebbe farlo:

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

Nota: questo non è testato.


1
Questo non è ancora ricorsivo. È possibile utilizzare findo una shell che supporta la **/*.scalaricorsione.
Janmoesen,

Modificato per aggiungere un comportamento ricorsivo ...
Sardathrion - contro l'abuso di SE

Si prega di non promuovere find | xargs. Usa find -execinvece, come ho già detto nella mia risposta. Più facile e più sicuro
Janmoesen,

Ho provato questo, nessun risultato. Il comando ritorna immediatamente e non cambia nulla all'interno dei file.
Ivan,

questo non è testato ma l'essenza funzionerà.
Sardathrion - contro l'abuso di SE il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.