web-dev-qa-db-ja.com

sedが「代替コマンドの不良フラグ」をスローする

次のように、CSSファイル内で絶対パスを相対パスに置き換える簡単なコマンドを実行します。

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

これを投げる

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

この単純なスクリプトの何が問題になっていますか?

31
Sergei Basharov

コマンドでは、s/\/fonts/../fonts/-iオプション(バックアップファイルに使用するサフィックス)のパラメーターとして使用され、引数filenameは編集コマンドとして扱われます。

バックアップファイルの作成を無効にするように指定する必要があります。

sed -i '' ...

あなたの例では:

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

コンピューターは愚かで、文脈によって物事を把握していないため、s/で始まるものが明らかに接尾辞ではなく編集コマンドであることを知ることができません。

48
Barmar

sed -i 's/\/fonts/../fonts/'は有効なsedコマンドではありません。sed -i 's#/fonts#../fonts#'

11
Endoro

私は同様の問題を抱えていました。 Macにgsedと呼ばれるsedのGNUバージョンをインストールし、標準のLinux構文を使用して使用できます。

そのためには、Sudo port install gsedを実行して、ポートを使用してgsedをインストールします(お持ちでない場合は、 http://www.macports.org/ で入手してください)。その後、gsed -i 's/old_pattern/new_pattern/g'を実行できます*

11
toquart