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 find
versione 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 sed
per 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 sed
processi.
sed
non comprende la \t
sequenza di escape della scheda. Puoi sostituirlo con un carattere di tabulazione letterale, che puoi inserire nella shell [Ctrl]+V, [Tab]
.
expand
è probabilmente meglio che sed
per 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 find
o 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.
mv
condizione che il successo di expand
:expand ... && mv ...
expand -t 4
di 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.
-print0
e -0
dire 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/e
perché 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.