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.