365 votes

La commande sed avec l'option -i échoue sur Mac, mais fonctionne sur Linux

J'ai utilisé avec succès les méthodes suivantes sed pour rechercher/remplacer du texte sous Linux :

sed -i 's/old_link/new_link/g' *

Cependant, lorsque je l'essaie sur mon Mac OS X, j'obtiens :

"La commande c attend un \N suivi d'un texte"

Je croyais que mon Mac fonctionnait avec un shell BASH normal. Qu'est-ce qu'il y a ?

EDIT :

Selon @High Performance, cela est dû à Mac sed étant d'une saveur différente (BSD), ma question est donc de savoir comment reproduire cette commande en BSD. sed ?

EDIT :

Voici un exemple concret qui en est la cause :

sed -i 's/hello/gbye/g' *

1 votes

Cela signifie que sed voit un "c" dans vos données comme une commande. Utilisez-vous une variable ? Veuillez poster quelque chose qui représente plus fidèlement la commande réelle et certaines données que vous traitez. Vous pouvez obtenir une démonstration simple de cette erreur en faisant echo x | sed c .

0 votes

@Dennis, la simple commande ci-dessus provoque cela, bien que les données qu'elle traite soient un site web entier (je convertis tous les liens d'images), y compris les fichiers html et css...

472voto

Sinetris Points 3032

Si vous utilisez le -i vous devez fournir une extension pour vos sauvegardes.

Si vous avez :

File1.txt
File2.cfg

La commande (notez l'absence d'espace entre -i et '' et le -e pour le faire fonctionner sur les nouvelles versions de Mac et sur GNU) :

sed -i'.original' -e 's/old_link/new_link/g' *

Créez 2 fichiers de sauvegarde comme :

File1.txt.original
File2.cfg.original

Il n'y a pas de moyen portable pour éviter de faire des fichiers de sauvegarde car il est impossible de trouver un mélange de commandes sed qui fonctionne dans tous les cas :

  • sed -i -e ... - ne fonctionne pas sous OS X car il crée -e sauvegardes
  • sed -i'' -e ... - Ne fonctionne pas sur OS X 10.6 mais fonctionne sur 10.9+.
  • sed -i '' -e ... - ne fonctionne pas sous GNU

Note Étant donné qu'il n'existe pas de commande sed fonctionnant sur toutes les plateformes, vous pouvez essayer d'utiliser une autre commande pour obtenir le même résultat.

Par exemple, perl -i -pe's/old_link/new_link/g' *

5 votes

J'ai eu le même problème. Merci pour cette solution. Mais lorsque j'ai essayé avec 'man sed' de trouver la description de '-i', rien sur l'utilisation de -i '' pour ignorer les sauvegardes n'est présent. C'est mon premier reproche. Deuxièmement, lorsque l'erreur "command expects \ suivi par du texte" apparaît, pourquoi ne nous dit-elle pas directement qu'elle attend un nom de sauvegarde pour l'option '-i' ! !!? Ce genre de chose arrive partout : vous obtenez une erreur mais vous ne savez pas pourquoi, alors vous cherchez le manuel qui n'explique rien. Puis vous allez sur Google pour trouver quelqu'un d'autre qui a le même problème. Je veux dire, pourquoi ne pas donner d'exemple dans le manuel ?

0 votes

Ou nous dire pourquoi l'erreur est là au lieu d'un simple message sans information qu'une erreur se produit. Ceci est une suggestion à tous les fabricants d'outils, si jamais ils peuvent lire ce commentaire.

6 votes

@lukmac Aussi loin que sed peut dire, vous n'avez pas fourni un suffixe de sauvegarde. Le suffixe de secours est s/old_link/new_link/g . Le prochain argument après cela est censé être les commandes d'édition. Parce qu'il a interprété les commandes comme le nom de la sauvegarde, il a ensuite pris le premier nom de fichier comme commandes d'édition, mais elles n'étaient pas valides.

81voto

Dennis Williamson Points 105818

Je crois que sous OS X, lorsque vous utilisez -i, une extension pour les fichiers de sauvegarde est requis . Essayez :

sed -i .bak 's/hello/gbye/g' *

Utilisation de GNU sed l'extension est en option .

67voto

chipiik Points 533

Cela fonctionne avec les versions GNU et BSD de sed :

sed -i'' -e 's/old_link/new_link/g' *

ou avec une sauvegarde :

sed -i'.bak' -e 's/old_link/new_link/g' *

Notez l'espace manquant après -i option ! (Nécessaire pour GNU sed)

9 votes

La première ne fonctionne pas sous OSX (je viens de la tester sous 10.6.8).

4 votes

Pour moi sur OS X (10.10.3), le premier a créé des fichiers de sauvegarde suffixés avec -e. Pas bon. La seconde était la seule chose qui fonctionnait pour moi de manière cohérente entre Ubuntu et OS X. Je ne voulais pas de fichiers de sauvegarde cependant, j'ai donc dû lancer un fichier rm juste après pour le supprimer.

2 votes

La première ligne devrait être réécrite avec un espace pour travailler sur 10.10 : sed -i'' ... => sed -i '' ...

10voto

Lucas Points 1191

La réponse de Sinetris est correcte, mais j'utilise ceci avec find pour être plus précis sur les fichiers que je veux modifier. En général, cela devrait fonctionner (testé sur osx /bin/bash ) :

find . -name "*.smth" -exec sed -i '' 's/text1/text2/g' {} \;

En général, lorsque vous utilisez sed sans find dans les projets complexes est moins efficace.

0 votes

-exec est très agréable ! Je me demande juste si le slash à la fin est vraiment nécessaire

2 votes

@YeLiu : sans le \ le ; a été interprété par l'interpréteur de commandes quand j'ai essayé de faire un tel

9voto

Votre Mac exécute effectivement un shell BASH, mais il s'agit plutôt de savoir avec quelle implémentation de sed vous avez affaire. Sur un Mac, sed vient de BSD et est subtilement différent de sed que vous pouvez trouver sur une boîte Linux typique. Je vous suggère man sed .

3 votes

Merci de m'avoir signalé le problème BSD - Mais je suis assez analphabète et j'ai juste besoin d'une solution rapide pour ma commande - un coup d'oeil rapide à man ne me dit rien.

6 votes

@Yarin -- non, et si je jette un coup d'œil rapide à man sed, cela ne vous dit rien non plus. Essayez un regard plus long.

26 votes

La plupart des réponses de l'OS sont enfouies quelque part dans un homme, mais c'est pour cela que l'OS existe - des personnes occupées qui ont besoin de réponses de personnes intelligentes.

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