Risposte:
Prova quanto segue:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Se vuoi quattro spazi, prova:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'sostituire più di una scheda per riga.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +" (cioè " +" invece di " \;"), se la findversione lo supporta (e non ho incontrato personalmente nessuna versione che non lo fa, ma non è uno standard POSIX , quindi suppongo che potrebbe accadere su alcuni sistemi. Vedi " -exec command {} +" nel manuale). Invece di lanciare un'istanza di sedper ogni file, questo creerà un elenco di argomenti con tutti gli argomenti dei nomi file che il sistema supporta ( getconf ARG_MAX= 2097152 sul mio sistema), proprio come xargs, e quindi avvia molti meno sedprocessi.
sednon comprende la \tsequenza di escape della scheda. Puoi sostituirlo con un carattere di tabulazione letterale, che puoi inserire nella shell [Ctrl]+V, [Tab].
expandè probabilmente meglio che sedper questo, come spiegato in: stackoverflow.com/a/11094620/131824
Ci sono molti modi per farlo. Ci sono anche molti modi per spararti al piede mentre lo fai se non stai attento o se sei nuovo su Linux come sembri. Supponendo che sia possibile creare un elenco di file che si desidera convertire, utilizzando qualcosa di simile findo manualmente con un editor, è sufficiente reindirizzare tale elenco nel seguente.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Un modo in cui puoi spararti ai piedi è quello di fare un refuso in modo da finire un file vuoto su tutti i nomi di file che specifichi, eliminando così il contenuto di tutti i tuoi file. Quindi fai attenzione e prova tutto quello che fai prima su un piccolo set di file di cui hai eseguito il backup.
mvcondizione che il successo di expand:expand ... && mv ...
expand -t 4di espandere le schede in 4 spazi. Inoltre, questo metodo può creare nuove righe finali. Ma altrimenti funziona.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo crea una variabile modello foo per ogni riga di input, in modo da poter fare riferimento all'input più di una volta.
-print0e -0dire a entrambi i comandi di usare \ 0 come separatore di riga anziché SPACE, quindi questo comando funziona per i percorsi con spazi.
Questo è meglio:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/eperché se qualcos'altro sta usando quel file, questo lo rovinerà. Come se due utenti volessero utilizzarlo contemporaneamente.
Ho provato a risolvere questo problema tenendo presenti i seguenti requisiti:
L'ultimo requisito è stato il più difficile da soddisfare perché "espandi" non consente di modificare i file in atto.
Ho trovato la seguente soluzione:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
Ecco qualche spiegazione:
expand, presumo che desideri preservare l'allineamento del testo.