Como posso usar um arquivo em um comando e redirecionar a saída para o mesmo arquivo sem truncá-lo? [duplicado]

0
cat package.yaml > package.yaml

O acima truncará package.yaml e, portanto, o arquivo estará vazio - cat terá saída vazia.

Como posso evitar o truncamento do arquivo? Existe uma alternativa para usar um arquivo temporário? Uma variável talvez?

    
por Chris Stryczynski 26.02.2018 / 19:15

1 resposta

1

Todos os utilitários que permitem a edição de arquivos no local fazem isso internamente gravando o resultado em um arquivo temporário e, em seguida, substituindo o arquivo original por esse arquivo temporário assim que a operação for concluída.

Arquivos podem ser modificados, mas você só poderá sobrescrever os dados existentes e / ou estender o tamanho do arquivo. Isso pode ser feito usando o utilitário dd , por exemplo:

$ cat file.txt
hello world
abc abc 123 123

$ cat insert.txt
hello!

$ dd if=insert.txt of=file.txt bs=1 seek=6 conv=notrunc
7+0 records in
7+0 records out 
7 bytes transferred in 0.000 secs (30918 bytes/sec)

$ cat file.txt
hello hello!
bc abc 123 123

Aqui, inserimos o que está em insert.txt em file.txt primeiro procurando 6 bytes no arquivo (passando por hello e o espaço) e depois modificando-o. O conv=notrunc impede que o arquivo de saída seja truncado no final da operação de gravação.

Se if=insert.txt fosse omitido, seria possível inserir qualquer texto no teclado. Note que "inserir" é o termo errado aqui realmente. "Sobrescrever" pode descrever melhor o que está acontecendo (veja o primeiro caractere da segunda linha sendo sobrescrito pela nova linha no final de insert.txt ).

Você não desejaria editar um arquivo dessa forma.

    
por 26.02.2018 / 19:20