¿Cómo reemplazo las pestañas iniciales con 4 espacios con sed?

¿Cómo reemplazo las pestañas iniciales con 4 espacios con sed?

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 expandque sirve, por ejemplo expand -t 4 file.txt.

expandno editará el archivo original, pero puede redirigir a un archivo nuevo y mvsobre el original, o usarlo spongesi 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 unexpandcómo hacer lo contrario, convertir varios espacios en pestañas.

Ambos expandy unexpandadmiten el uso de pestañas de ancho fijo (por ejemplo , -t 4o -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 spongey¿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.

spongees 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

información relacionada