Existe um pequeno problema com o modo de edição no local sed -i . sed cria um arquivo temporário no mesmo diretório chamado sedy08qMA , em que y08qMA é uma string gerada aleatoriamente. Esse arquivo é preenchido com o conteúdo modificado do arquivo original. Após a operação, sed remove o arquivo original e renomeia o arquivo temporário com o nome do arquivo original. Portanto, não é uma verdadeira edição local . Ele cria um novo arquivo com permissões do usuário chamador e um novo número de inode. Esse comportamento geralmente não é ruim, mas, por exemplo, links rígidos são quebrados.
No entanto, se você quiser true na edição local, você deve usar ed . Ele lê os comandos do stdin e edita o arquivo diretamente, sem um arquivo temporário (é feito sobre o buffer de memória de ed ). Uma prática comum é usar printf para gerar a lista de comandos:
printf "%s\n" '1,$s/search/replace/g' wq | ed -s file
O comando printf produz a saída da seguinte forma:
1,$s/search/replace/g
wq
Essas duas linhas são ed de comandos. O primeiro pesquisa a string search e a substitui por replace . O segundo escreve ( w ) as alterações no arquivo e sai ( q ). -s suprime a saída de diagnóstico.