296 votes

sed en place du pavillon qui fonctionne aussi bien sur Mac (BSD) et Linux

Est-il une invocation de l' sed todo dans l'édition sans les sauvegardes qui fonctionne à la fois sur Linux et Mac? Alors que la BSD sed livré avec OS X semble avoir besoin d' sed -i '' …, la GNU sed distributions Linux viennent généralement avec interprète les guillemets vides nom de fichier d'entrée (au lieu de la sauvegarde de l'extension), et les besoins en sed -i … à la place.

Est-il une syntaxe de ligne de commande qui fonctionne aussi bien avec les saveurs, donc je peux utiliser le même script sur les deux systèmes?

283voto

kine Points 263

Si vraiment vous voulez juste utiliser sed -i 'facile' façon, le code suivant fonctionne sur les deux GNU et BSD/Mac sed:

sed -i.bak 's/foo/bar/;' ./file

Remarque le manque d'espace et la dot.

La 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

Bien évidemment, on pourrait donc supprimer l' .bak le fichier.

126voto

klickverbot Points 1247

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 pouvez pas utiliser sed -i -e depuis l'extension du fichier de sauvegarde faudrait -e
  • ne pouvez pas utiliser sed -i'' -e , pour les mêmes raisons-il besoin d'un espace entre -i et ''.

16voto

analogue Points 1430

Il n'existe aucun moyen d'avoir de travail.

Une façon est d'utiliser un fichier temporaire comme:

TMP_FILE=`mktemp /tmp/config.XXXXXXXXXX`
sed -e "s/abc/def/" some/file > $TMP_FILE
mv $TMP_FILE some/file

Cela fonctionne sur les deux

15voto

Steve Powell Points 4722

Réponse: Aucune.

À l'origine, a accepté de répondre effectivement ne pas faire ce qui est demandé (comme indiqué dans les commentaires). (J'ai trouvé cette réponse lors de la recherche de la raison pour laquelle un file-e a été apparaissant de façon "aléatoire" dans mes répertoires.)

Il n'y a apparemment aucun moyen de se sed -i à travailler de manière cohérente sur les deux systèmes et Linuces.

Ma recommandation, pour ce qu'elle vaut, n'est pas de mise-en-place avec sed (complexes des modes de défaillance), mais aussi à générer de nouveaux fichiers et de les renommer par la suite. En d'autres termes: évitez -i.

7voto

Big Rich Points 1833

Steve Powell réponse est tout à fait correct, la consultation de la page de MAN de sed sur OSX et Linux (Ubuntu 12.04) met en évidence la compatibilité au sein des "en lieu" de la sed d'utilisation entre les deux systèmes d'exploitation.

JFYI, il devrait y avoir aucun espace entre le je et toutes les citations (qui dénotent un vide extension de fichier) à l'aide de la version Linux de sed, ainsi

sed Linux Page de Man

#Linux
sed -i"" 

et

sed OSX page de Man

#OSX (notice the space after the '-i' argument)
sed -i "" 

J'ai mis ceci dans un script en utilisant un alias avais de commande et le système d'exploitation de nom de sortie de 'uname' dans un bash "si". Essayez de stocker des OS dépendant de chaînes de commande dans les variables de succès et l'échec lors de l'interprétation de la cite. L'utilisation de"shopt -s expand_aliasesest nécessaire afin de développer/utiliser les alias définis dans votre script. shopt utilisation est traitée ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X