web-dev-qa-db-fra.com

Code de commande invalide., malgré les périodes d'échappement, utilisant sed

Être obligé d'utiliser CVS pour un client actuel et l'adresse changée pour le référentiel distant. Le seul moyen que je puisse 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 à travailler:

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

Je reçois une erreur pour chaque fichier:

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

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

157
helion3

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

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

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

Voir this .

382
damienfrancois

Vous avez simplement oublié de fournir un argument à -i. Il suffit de changer -i en -i ''.

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

35
mdup

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

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

Il serait également bon de mettre s/// entre guillemets simples plutôt que des guillemets doubles pour éviter toute substitution de variable ou tout autre comportement inattendu.

1
jkshah