web-dev-qa-db-fra.com

sed lance un «mauvais drapeau dans une commande de remplacement»

Je veux exécuter une commande simple pour remplacer les chemins absolus par des chemins relatifs dans un fichier CSS comme ceci:

sed -i 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css

Ça jette ça

sed: 1: "/Users/sergeybasharov/W ...": bad flag in substitute command: 'b'

Quel peut être le problème dans ce script simple?

31
Sergei Basharov

Dans votre commande s/\/fonts/../fonts/ est pris comme paramètre pour le -i (le suffixe à utiliser pour le fichier de sauvegarde) et l'argument du nom de fichier est traité comme les commandes d'édition.

Vous devez spécifier pour désactiver la création du fichier de sauvegarde:

sed -i '' ...

Dans votre exemple:

sed -i '' 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css

Les ordinateurs sont stupides, ils ne comprennent pas les choses par contexte, ils ne peuvent donc pas dire que quelque chose commençant par s/ est évidemment une commande d'édition, pas un suffixe.

48
Barmar

sed -i 's/\/fonts/../fonts/' n'est pas une commande sed valide, essayez sed -i 's#/fonts#../fonts#'

11
Endoro

J'avais un problème similaire. Vous pouvez installer la version GNU de sed dans votre Mac, appelée gsed, et l'utiliser en utilisant la syntaxe Linux standard.

Pour cela, installez gsed en utilisant les ports (si vous ne l'avez pas, obtenez-le sur http://www.macports.org/ ) en exécutant Sudo port install gsed. Ensuite, vous pouvez exécuter gsed -i 's/old_pattern/new_pattern/g' *

11
toquart