2010-11-22 6 views
0

私がhereを受け取った有益な回答に基づいて、convert_image_paths.commandという名前の次のスクリプトを作成し、それをmy macのウェブサイトフォルダに入れてダブルクリックしました。ちょうど私のsedスクリプトによって嫌にされた - なぜ?

#!/bin/bash 

# This script will operate on valid relative image paths at this level and one sub-level down, across .html and .css files. 

find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/\.\.\/images\//images\//g' {} ';' 
find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {} ';' 

残念ながら、代わりに新しいCDN URLにウェブサイトでの相対的な画像のパスを変更するのではなく、

  1. URLダブルアップ:http://mycdn.com/http://mycdn.com/images/myimage.png
  2. をしたとEVERY HTML/CSSファイルのために私のマシン

私の質問はa)そこにバカのためのタグがありますかb)このスクリプトを修正するにはどうすればいいですか?

EDIT:

は私が私の意図を明確にしましょう: 私は、フォーム

"画像/ {myimagepath}"

で相対URLを持つすべてのイメージのパスに変更を適用したいです

または

"../images/{myimagepath}"

+0

そして、これがありますなぜあなたは-eでテストし、それが動作することを知っているときにのみ-iを使います。 – Sorpigal

+0

'-e'とはまったく関係ありません。最初に '-i'なしで実行してください。これは、結果をstdoutに出力するのではなく、sedがその場でファイルを編集するように指示するオプションです。 '-e'は、次の引数が実行するsedコマンドであることをsedに伝えます。 'sed -e 'は 'sed 'と全く同じです。これは主に複数のコマンドを実行するのに便利です。 – Cascabel

答えて

4

はあなたの2番目の質問に答えるために: "見つける"

b)はしないでくださいをスクリプトがどのディレクトリから始まっているのかわからないとき特定のディレクトリから開始する場合は、findコマンドで指定します。find /Users/ptomblin/Shared/ ...

URLが2倍になったのは、それが理由です。

sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {} 

は、「画像/」単語のすべてのインスタンスを取得し、それはすでに「http://mycdn.com/」で始まっていても、「http://mycdn.com/images/」にそれを変更しました。それがあなたが望むものでないなら、あなたはあなたの正規表現についてより具体的にする必要があります。

最初の試みとして、私は、彼らは二重引用符で始まる場合のみ、imagesまたは../imagesを置き換えます、次の

find /Users/ptomblin/Shared -name "*.css" -o -name "*.html" -exec sed -i '' '[email protected]".{0,2}/[email protected]"http://mycdn.com/[email protected]' {} 

で両方のラインを置き換えます。

+0

ありがとうございます。どうすれば "images/{myimage}"を "http:// mycdn/images/{myimage}"に置き換えることなく倍増しますか? – Yarin

+0

@ヤリン、私の編集を参照してください。 –

+0

美しい - ありがとうたくさん – Yarin

1

find .は「カレントディレクトリ内で検索」を意味します - ので、あなたはすべての内容でこの置換をしたいディレクトリからこれを実行するようにしてください、または引数を取るためのスクリプトを変更します。

#!/bin/bash 
if [ $# -lt 1 ]; then 
    echo "usage: myscript <path>" 
fi 

find "[email protected]" ... 

物事が倍増した理由についての私の推測は、単にそれが2度実行されたということです。元のスクリプトの2番目の置換は "http://mycdn.com/images"となり、イメージを再度置換します!ここでは2個の置換を組み合わせて、同時にその問題を解決する明白な方法があります:

sed -i '[email protected]"\(\.\./\|\)images/@"http://mycdn.com/images/@g' 

マッチHTTPがすでにありますときに代用していないことを確認するためのオープン引用に対して:// ...、オプションで../後にマッチします。

私は間違いなく場所に代わりに編集をstdoutに印刷された結果で、単一のファイルでこれを呼び出すことによってテストを示唆している:私のオリジナルのスクリプトは、それが現在のディレクトリだ認識しなかった理由を私も考え出し

sed '[email protected]@[email protected]' <file> 
+0

パスの安全コードのために非常に感謝 - 私はそれが私が関連ディレクトリからそれを実行したように起こった方法をまだ理解していない - 正規表現のコードについては、 (編集を参照) - 良い一ライナーのアイデア? – Yarin

+0

@ヤリン:修正で編集されました。 Paul Tomblinの作品も同様です。私たちはパターンを違った方法で書きました。彼の長さは少し短く、可能な別の接頭辞があれば混乱しやすいです。 – Cascabel

+0

これは大変ありがとうございます – Yarin

1

。 Macでは、.command拡張子を持つスクリプトファイルに名前を付けると、ダブルクリックが可能になります。ただし、をダブルクリックして実行すると、がコマンドラインではなくに変更され、作業ディレクトリがユーザのホームディレクトリに変更されます。

myscript.command:

echo "pwd = `pwd`" 

./myscript.command: PWD =カレントディレクトリ

myscript.commandダブルクリック: PWD =ユーザーのホームディレクトリ

関連する問題