Respuestas:
Intenta lo siguiente:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Si quieres cuatro espacios, prueba:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
reemplazar más de una pestaña por línea.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" (es decir, " +
" en lugar de " \;
"), si la find
versión lo admite (y personalmente no he conocido ninguna versión que no lo haga, pero no es un estándar POSIX , así que supongo que podría suceder en algunos sistemas. Consulte " -exec command {} +
" en el manual). En lugar de lanzar una instancia sed
para cada archivo, esto generará una lista de argumentos con tantos argumentos de nombre de archivo como el sistema admite ( getconf ARG_MAX
= 2097152 en mi sistema), al igual que xargs
, y así lanzará muchos menos sed
procesos.
sed
no comprende la \t
secuencia de escape de la pestaña. Puede reemplazarlo con un carácter de tabulación literal, que puede ingresar en el shell por [Ctrl]+V, [Tab]
.
expand
es probablemente mejor que sed
para esto, como se explica en: stackoverflow.com/a/11094620/131824
Hay muchas formas de hacer esto. También hay muchas maneras de dispararte en el pie mientras haces esto si no tienes cuidado o si eres nuevo en Linux como parece ser. Suponiendo que puede crear una lista de archivos que desea convertir, ya sea mediante el uso de algo como find
o manualmente con un editor, simplemente canalice esa lista en lo siguiente.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Una forma en la que puedes dispararte en el pie con eso es hacer un error tipográfico para que termines moviendo un archivo vacío a todos los nombres de archivo que especifiques, eliminando así el contenido de todos tus archivos. Así que tenga cuidado y pruebe lo que haga primero en un pequeño conjunto de archivos de los que ha hecho una copia de seguridad.
mv
condición de que el éxito de expand
:expand ... && mv ...
expand -t 4
expandir las pestañas a 4 espacios. Además, este método puede crear nuevas líneas finales. Pero de lo contrario funciona.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo
crea una plantilla variable foo para cada línea de entrada, para que pueda consultar la entrada más de una vez.
-print0
y -0
diga a ambos comandos que usen \ 0 como separador de línea en lugar de ESPACIO, por lo que este comando funciona para rutas con espacios.
Esto es mejor:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
porque si algo más está usando ese archivo, esto lo estropeará. Como si dos usuarios quisieran usar esto al mismo tiempo.
Le di una oportunidad a este problema con los siguientes requisitos en mente:
El último requisito fue el más difícil de cumplir porque "expandir" no permite modificar los archivos en su lugar.
Se me ocurrió la siguiente solución:
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'
Aquí hay alguna explicación:
expand
, supongo que quiere preservar la alineación del texto.