GNU/Linux >> Tutoriels Linux >  >> Linux

sed in-place flag qui fonctionne à la fois sur Mac (BSD) et Linux

Sous OSX, j'installe toujours la version GNU sed via Homebrew, pour éviter les problèmes de scripts, car la plupart des scripts ont été écrits pour les versions GNU sed.

brew install gnu-sed --with-default-names

Ensuite, votre BSD sed sera remplacé par GNU sed.

Alternativement, vous pouvez installer sans les noms par défaut, mais alors :

  • Modifier votre PATH comme indiqué après l'installation de gnu-sed
  • Vérifiez vos scripts pour choisir entre gsed ou sed selon votre système

Cela fonctionne avec GNU sed, mais pas sur OS X :

sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file

Cela fonctionne sur OS X, mais pas avec GNU sed :

sed -i '' -e 's/foo/bar/' target.file

Sur OS X, vous

  • ne peut pas utiliser sed -i -e puisque l'extension du fichier de sauvegarde serait définie sur -e
  • ne peut pas utiliser sed -i'' -e pour les mêmes raisons—il faut un espace entre -i et '' .

Si vous voulez vraiment utiliser sed -i la manière "facile", ce qui suit fonctionne à la fois sur GNU et BSD/Mac sed :

sed -i.bak 's/foo/bar/' filename

Notez le manque d'espace et le point.

Preuve :

# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

Évidemment, vous pouvez alors simplement supprimer le .bak fichiers.


Comme le demande Noufal Ibrahim, pourquoi ne pouvez-vous pas utiliser Perl ? Tout Mac aura Perl, et il y a très peu de distributions Linux ou BSD qui n'incluent pas une version de Perl dans le système de base. L'un des seuls environnements qui pourraient réellement manquer de Perl serait BusyBox (qui fonctionne comme GNU/Linux pour -i , sauf qu'aucune extension de sauvegarde ne peut être spécifiée).

Comme le recommande ismail,

Puisque perl est disponible partout, je fais juste perl -pi -e s,foo,bar,g target.file

et cela semble être une meilleure solution dans presque tous les cas que les scripts, les alias ou d'autres solutions de contournement pour faire face à l'incompatibilité fondamentale de sed -i entre GNU/Linux et BSD/Mac.


Linux
  1. Comment rediriger la sortie vers un fichier et Stdout sous Linux

  2. Comment vider (tronquer) un fichier sous Linux qui existe déjà et qui est protégé d'une manière ou d'une autre ?

  3. Trouver le fichier puis cd dans ce répertoire sous Linux

  4. (C/C++) Comment générer un fichier exécutable pouvant fonctionner à la fois sous Windows et Linux ?

  5. Linux à la fois sensible à la casse ET insensible à la casse et toujours gênant ?

Comment modifier le fichier Hosts sous Linux, Windows ou Mac

Comment monter et démonter des systèmes de fichiers sous Linux

Commande Ls sous Linux (liste des fichiers et des répertoires)

Fichier hôte Linux :comment le modifier et l'utiliser ?

Une introduction au hachage et aux sommes de contrôle sous Linux

Comment créer et utiliser un fichier d'échange sous Linux