2013-07-08 4 views
19

ich einen einfachen Befehl ersetzt absolute Pfade relative Werte in einer CSS-Datei wie folgt ausgeführt werden soll:sed wirft ‚schlechte Flagge in Ersatz Befehl‘

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

Es wirft diesen

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

Was kann in diesem einfachen Skript falsch sein?

+0

Es gibt keine' b 'überall in Ihrem Befehl, es darf nicht sein, was Sie tatsächlich eingegeben haben. Bitte fügen Sie das eigentliche Skript ein. – Barmar

+0

Ja, wirklich, nur ein kürzeres Äquivalent :). Ich habe auf die volle Variante aktualisiert. –

+0

Es gibt ein Problem mit Ihrem Zitat, das bewirkt, dass der Dateiname in den Ersatzbefehl eingeschlossen wird, aber ich sehe es nicht in dem, was Sie zitiert haben. Sie verpassen jedoch einen Backslash. – Barmar

Antwort

35

In Ihrem Befehl s/\/fonts/../fonts/ als Parameter an die -i Option genommen wird (das Suffix für die Sicherungsdatei verwenden), und der Dateiname Argument behandelt wird als die Bearbeitungsbefehle.

Sie müssen angeben, die Backup-Datei erstellen zu deaktivieren:

sed -i '' ... 

In Ihrem Beispiel:

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

Computer sind dumm, sie Gestalt nicht Dinge aus dem Zusammenhang heraus, so dass sie Erzähle nicht, dass etwas, das mit s/ beginnt, ist, offensichtlich ein Bearbeitungsbefehl, kein Suffix.

+0

+1, interessant, in Windows habe ich dieses Problem nicht, ich muss immer doppelte Anführungszeichen verwenden. – Endoro

+0

@Endoro Die Art der Zitate ist in diesem Fall irrelevant, wichtig ist, dass Sie dort ein explizites Argument haben müssen. – Barmar

+0

Vielleicht in 'OSX' sed, in' GNU' sed '-i' funktioniert ohne ein Argument. Gut zu wissen :) – Endoro

9

sed -i 's/\/fonts/../fonts/' ist kein gültiger sed Befehl, versuchen sed -i 's#/fonts#../fonts#'

+1

Wahr, aber es verursacht diesen speziellen Fehler nicht. – Barmar

+0

Total vergessen, Sie können verschiedene Trennzeichen in sed verwenden. Dies löste mein Problem, weil meine Substitution Schrägstriche enthielt. Brillant! – TryTryAgain

6

Ich hatte ein ähnliches Problem. Sie können die GNU-Version von sed auf Ihrem Mac, genannt gsed, installieren und sie mit der Linux-Standard-Syntax verwenden.

Dafür installieren Sie gsed mit Ports (wenn Sie es nicht haben, holen Sie es bei http://www.macports.org/), indem Sie sudo Port installieren gsed. Dann können Sie laufen GSED -i 's/old_pattern/new_pattern/g *

+5

Gleichwertig, wenn Homebrew verwendet ist brauen installieren gnu-sed – rich

+1

omg, das ist ein Lebensretter – ling