sed: -i ne peut pas être utilisé avec stdin sous Mac OS X

J’utilise un parsingur de bisons dans mon projet. Lorsque je lance la commande suivante:

sed -i y.tab.c -e "s/ __atsortingbute__ ((__unused__))$/# ifndef __cplusplus\n __atsortingbute__ ((__unused__));\n# endif/" 

Je reçois cette erreur sed: -i ne peut pas être utilisé avec stdin

La commande fonctionne bien sur les machines Linux. J’utilise Mac OS X 10.9. Il jette une erreur uniquement sur mac os x. Je ne suis pas sûr pourquoi. Quelqu’un peut-il aider?

Merci

Vous devez placer le fichier d’entrée en dernier paramètre.

 sed -i -e "s/ __atsortingbute__ ((__unused__))$/# ifndef __cplusplus\n __atsortingbute__ ((__unused__));\n# endif/" y.tab.c 

Le problème est que Mac OS X utilise la version BSD de sed , qui traite l’option -i légèrement différemment. La version GNU utilisée dans Linux prend un argument optionnel avec -i : si présent, sed crée un fichier de sauvegarde dont le nom est constitué du fichier d’entrée et de l’argument. Sans argument, sed modifie simplement le fichier d’entrée sans enregistrer une sauvegarde de l’original.

Dans BSD sed , l’argument de -i est requirejs. Pour éviter de faire une sauvegarde, vous devez fournir un argument de longueur nulle, par exemple sed -i '' y.tab.c ...

Votre commande, qui édite simplement y.tab.c sans sauvegarde sous Linux, tenterait de sauvegarder un fichier de sauvegarde en utilisant «y.tab.c» comme extension. Mais maintenant, sans autre fichier dans la ligne de commande, sed pense que vous souhaitez modifier l’entrée standard en place, ce qui n’est pas autorisé.

Depuis la page de manuel sed:

-i extension Modifier les fichiers en place, en sauvegardant les sauvegardes avec l’extension spécifiée. Si une extension de longueur nulle est donnée, aucune sauvegarde ne sera enregistrée. Il est déconseillé d’atsortingbuer une extension de longueur nulle aux fichiers d’édition sur place, car vous risquez de corrompre ou de supprimer un contenu partiel dans des situations où l’espace disque est insuffisant, etc.

La solution consiste à envoyer une extension de longueur nulle comme ceci:

 sed -i '' 's/apples/oranges/' file.txt 

Piggy-back de l’explication de @ chepner pour une solution rapide et sale:

Installez la version de sed qui fera le travail avec brew install gnu-sed , puis remplacez les utilisations de sed dans votre script par gsed .

(La communauté homebrew connaît assez bien les problèmes pouvant survenir lors de la substitution inattendue d’OS X et s’est efforcée de ne pas le faire pour la plupart des autres commandes.)