En vim parece posible hacer así:
:s/^\t\+/\=repeat(' ',len(submatch(0)))
No descubrí cómo se traduce esto en sed. Intenté lo siguiente:
sed -ri "s/^\t\+/\=repeat(' ',len(submatch(0)))/g" test.txt
El comando parece no tener ningún efecto.
Respuesta1
Esto es para lo expand
que sirve, por ejemplo expand -t 4 file.txt
.
expand
no editará el archivo original, pero puede redirigir a un archivo nuevo y mv
sobre el original, o usarlo sponge
si lo tiene instalado, por ejemplo
expand -t 4 file.txt > file.new && mv file.new file.txt
or
expand -t 4 file.txt | sponge file.txt
Para su información, consulte unexpand
cómo hacer lo contrario, convertir varios espacios en pestañas.
Ambos expand
y unexpand
admiten el uso de pestañas de ancho fijo (por ejemplo , -t 4
o -t 8
, etc.)ouna lista de posiciones de pestañas (por ejemplo -t 4,12,32
). También tienen opciones para convertir solo espacios/tabulaciones iniciales. Consulte las páginas de manual para obtener más detalles.
Para obtener más información sobre sponge
, consulte man sponge
y¿Existe una alternativa estándar a la esponja para insertar una lima en sí misma?. En resumen, realiza la redirección y mv por usted, utilizando un archivo temporal. Por cierto, nunca intentes redirigir la salida estándar al mismo archivo que se está utilizando actualmente como entrada estándar. El shell lo sobrescribirá incluso antes de que se lea.
sponge
es de lamásutilspaquete.
PD: Ver tambiénSangría GNUo una de muchas otras herramientas similares para reformatear el código fuente.
Respuesta2
$ cat -T /tmp/test.txt
^I^I^I3^I<= this final tab should remain
^I^I2
^I1
Usando sed:
sed ':loop;s/^\( *\)\t/\1 /;tloop' /tmp/test.txt | cat -T
3^I<= this final tab should remain
2
1
Lo anterior configura un bucle (etiquetado, irónicamente loop
) que captura los espacios iniciales y una tabulación inicial; reemplaza los espacios y convierte la pestaña a 4 espacios; si tiene éxito ( t
), vuelve al bucle. Verhttps://stackoverflow.com/a/35017207/493161