Como substituo as guias iniciais por 4 espaços por sed?

Como substituo as guias iniciais por 4 espaços por sed?

No vim parece possível fazer assim:

:s/^\t\+/\=repeat('    ',len(submatch(0)))

Não descobri como isso se traduz em sed. Eu tentei o seguinte:

sed -ri "s/^\t\+/\=repeat('    ',len(submatch(0)))/g" test.txt

O comando parece não ter efeito.

Responder1

É para isso que expandserve, por exemplo expand -t 4 file.txt.

expandnão editará o arquivo original, mas você pode redirecioná-lo para um novo arquivo e mvsubstituí-lo pelo original, ou usá-lo spongese o tiver instalado, por exemplo

    expand -t 4 file.txt > file.new && mv file.new file.txt
or 
    expand -t 4 file.txt | sponge file.txt

Para sua informação, veja unexpandcomo fazer o inverso, converter vários espaços em tabulações.

Ambos expande unexpandsuporte ao uso de guias de largura fixa (por exemplo , -t 4ou -t 8, etc)ouuma lista de posições de tabulação (por exemplo -t 4,12,32, ). Eles também têm opções para converter apenas espaços/tabulações iniciais. Consulte as páginas de manual para obter detalhes.


Para obter mais informações sobre sponge, consulte man spongeeExiste uma alternativa padrão à esponja para canalizar um arquivo para si mesmo?. Resumindo, ele faz o redirecionamento e o mv para você, usando um arquivo temporário. Aliás, nunca tente redirecionar o stdout para o mesmo arquivo que está sendo usado atualmente como stdin. O shell irá sobrescrevê-lo antes mesmo de ser lido.

spongeé domaisutilspacote.


PS: Veja tambémRecuo GNUou uma das muitas outras ferramentas semelhantes de reformatação de código-fonte.

Responder2

$ 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

O texto acima configura um loop (rotulado, ironicamente, loop) que captura quaisquer espaços iniciais e uma tabulação inicial; substitui os espaços e converte a tabulação em 4 espaços; se for bem sucedido ( t), ele volta para o loop. Verhttps://stackoverflow.com/a/35017207/493161

informação relacionada