tr ' ' '\t' < file 1<> file
Substituiria cada caractere de espaço por um caractere de tabulação.
Só para responder às pessoas dizendo que não é seguro:
O shell abrirá o arquivo para leitura no descritor de arquivo 0, e para leitura e gravação no descritor de arquivo 1. Se algum desses falhar, ele sairá, tr
nem será executado. Se os redirecionamentos forem bem-sucedidos, tr
será executado.
tr
lerá o arquivo um bloco por vez, fará a transliteração e emitirá o bloco modificado sobre o não modificado.
Ao fazer isso, geralmente não será necessário alocar espaço no disco. Exceção para isso seria se o arquivo era esparso para começar, ou sistemas de arquivos que implementam copy-on-write. Portanto, erros para "não há espaço disponível" não são prováveis.
Outros erros podem ocorrer como erro de E / S se o disco abaixo estiver falhando ou se o sistema de arquivos estiver em um dispositivo de bloco que tenha sido thinly provisioned (como um instantâneo LVM), sendo ambas as condições raras e de qualquer maneira provavelmente envolver o retorno de um backup.
Em qualquer caso, após a falha da chamada do sistema write()
, tr
deve reportar um erro e sair. Como seu stdout está aberto no modo de leitura / gravação, ele não será truncado. Para que o arquivo seja truncado, tr
teria que chamar explicitamente truncate()
em sua saída padrão na saída, o que não faria sentido.
O que aconteceria, no entanto, seria que o arquivo seria parcialmente transliterado (até o ponto em que tr
falhou).
O que eu descobri é que o GNU tr
atualmente encontrado no Debian sid amd64 tem um bug em que os segfaults após uma falha da chamada do sistema write()
e saída de lixo no stdout ( edit , agora corrigido desde a versão 2.19-1 do pacote Debian libc6 ). Isso corromperia o arquivo (mas não o truncaria).
tr ' ' '\t' < file > newfile && mv newfile file
não substitui file
, a menos que o newfile
tenha sido criado corretamente, mas tenha vários problemas associados a ele:
- você precisa ter certeza de não estragar um
newfile
já existente (pense também em symlinks) - Você precisa de acesso de gravação ao diretório atual
- você precisa de espaço de armazenamento adicional para essa cópia extra do arquivo
- você está perdendo as permissões, a propriedade, a hora de nascimento, os atributos estendidos ... do arquivo original
- se o arquivo original for um link simbólico, você o substituirá por um regular.
tr ' ' '\t' < file 1<> file
é mais seguro que o comumente usado perl -pi -e 's/ /\t/g'
porque, após uma falha de perl
(como no disco cheio), você perde o arquivo original e obtém apenas o que o perl
gerou até agora.