Pourquoi est sed -i
exécuté sur le lien symbolique détruit ce lien et le remplace par le fichier de destination? Comment éviter cela?
par exemple.
$ 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
Et pourquoi n'est-il pas considéré comme un bug?
Ce n'est pas un bug, c'est par conception car
sed
c'est un éditeur S tream ED , pas un éditeur de fichiers. Il fait essentiellement une copie et remplace le fichier d'origine par la copie. BashFAQAlternativement, vous pouvez utiliser une
ex
commande qui a une syntaxe de substitution similaire, par exempleou plusieurs fichiers:
Cela ne détruira pas les liens symboliques.
Connexes: Comment empêcher sed de détruire les hardinks?
la source
Je trouve que cela fonctionne aussi bien (en préservant les liens symboliques et durs):
la source
Il existe une solution que nous utilisons parfois pour écrire dans le même fichier que celui lu. Voici un extrait de la page de manuel:
Voici un extrait qui montre qu'il peut préserver les liens symboliques, bien que je l'utilise généralement pour préserver les inodes:
qui produit:
Sur un système comme:
Le code éponge est disponible dans un package moreutils - quelques détails:
Dans notre boutique, nous avons écrit une version qui écrit dans un fichier temporaire pour le cas de très gros fichiers.
Le paquet est disponible sur Debian, Fedora, macOS (via brew), etc.
la source