code de commande non valide., malgré les périodes d'échappement, en utilisant sed


187

Être obligé d'utiliser CVS pour un client actuel et l'adresse modifiée pour le dépôt distant. La seule façon que je peux trouver pour changer l'adresse distante dans mon code local est une recherche et un remplacement récursifs.

Cependant, avec la commande sed, je m'attendrais à fonctionner:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

J'obtiens une erreur pour chaque fichier:

sed: 1: ".//file/path ...": invalid command code .

J'ai essayé d'échapper aux périodes du match / remplacement sed mais cela ne résout rien.

Réponses:


476

Si vous utilisez un OS X, cela n'a probablement rien à voir avec la commande sed. Sur la version OSX de sed, l' -ioption attend un extensionargument afin que votre commande soit réellement analysée en tant extensionqu'argument et le chemin du fichier soit interprété comme le code de commande.

Essayez d'ajouter l' -eargument explicitement et de donner ''comme argument à -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

Regarde ça .


41
Si vous avez passé 10 min comme moi à trouver la différence, c'est l'option -e
acheron55

9
Cette question répond à la RE error: illegal byte sequencesur MacOS.
JonasVautherin le

11
J'ai utilisé une chaîne vide '' comme paramètre pour -i et cela a fonctionné, commesed -i '' 's/blah/xx/g'
Pierre Houston

25
Pour moi, en ajoutant -eaprès -ifait sedsauvegarde tous mes fichiers de cette manière: « foo.txt » -> « foo.txt-e ». Évidemment, ce que je voulais était plutôt -i '', c'est-à-dire ne pas sauvegarder les fichiers modifiés.
mdup

3
Même problème pour moi. Ceci -i -ecombiné avec un a findabouti à de nombreux fichiers se terminant par -e-e-e-e-e-e-e.
aspyct

39

Vous avez simplement oublié de fournir un argument à -i. Changez simplement -ipour -i ''.

Bien sûr, cela signifie que vous ne voulez pas que vos fichiers soient sauvegardés; sinon fournissez l'extension de votre choix, comme -i .bak.


6

Sur OS X, rien n'aide les pauvres sed intégrés à devenir adéquats. La solution est:

brew install gnu-sed

Et puis utilisez gsed au lieu de sed, qui fonctionnera comme prévu.


1
Merci pour cette réponse, qui a très bien fonctionné pour moi! Travaillant à la fois sur Linux et Mac, je préférerais de loin l'accès à un outil familier plutôt que d'apprendre des différences mystérieuses entre deux outils étroitement liés.
Stephen Shank

3

Votre nouveau domaine contient probablement /? Si tel est le cas, essayez d'utiliser un séparateur autre que /in sed, par exemple #, ,etc.

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

Il serait également bon de placer s///entre guillemets simples plutôt que guillemets doubles pour éviter la substitution de variables ou tout autre comportement inattendu

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.