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 expand
serve, por exemplo expand -t 4 file.txt
.
expand
não editará o arquivo original, mas você pode redirecioná-lo para um novo arquivo e mv
substituí-lo pelo original, ou usá-lo sponge
se 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 unexpand
como fazer o inverso, converter vários espaços em tabulações.
Ambos expand
e unexpand
suporte ao uso de guias de largura fixa (por exemplo , -t 4
ou -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 sponge
eExiste 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