Por que o sed -i
executado no link simbólico destrói esse link e o substitui pelo arquivo de destino? Como evitar isso?
por exemplo.
$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:46 pet
lrwxrwxrwx 1 madneon madneon 6 mar 23 16:48 pet_link -> pet
$ sed -i 's/cat/dog/' pet_link
$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:48 pet
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:49 pet_link
E por que não é considerado um bug?
Não é um bug, isso ocorre por design, uma vez que
sed
é um editor S tream ED , não um editor de arquivos. Basicamente, ele faz uma cópia e substitui o arquivo original pela cópia. BashFAQComo alternativa, você pode usar o
ex
comando que possui sintaxe semelhante para substituição, por exemploou vários arquivos:
Não destruirá os links simbólicos.
Relacionado: Como evito que o sed destrua hardinks?
fonte
Acho que isso também funciona bem (preservando os links simbólicos e físicos):
fonte
Às vezes, há uma solução que usamos para gravar no mesmo arquivo que é lido. Aqui está um trecho da página de manual:
Aqui está um trecho que mostra que ele pode preservar links simbólicos, embora eu costumo usá-lo para preservar inodes:
que produz:
Em um sistema como:
O código da esponja está disponível em um pacote moreutils - alguns detalhes:
Em nossa loja, escrevemos uma versão que grava em um arquivo temporário para o caso de arquivos muito grandes.
O pacote está disponível no Debian, Fedora, macOS (via brew), etc.
fonte