web-dev-qa-db-ja.com

Sed与える:sed:読み込めない:そのようなファイルまたはディレクトリはない

見つかった画像ごとに繰り返す次のbashスクリプトがあります。すべてhtmlcssおよびjsファイル、およびそのファイル内の画像のすべての出現を置き換えます。

 for image in app/www/images-theme-dark/*.png
    do
        echo "installing icon" $image

        # extract filename from iconpath
        iconfile=$(basename $image)
        iconPath="images/"$(basename $image)

        # replace paths in all files containing icon paths
        find app/www -type f \( -name "*.html" -or -name "*.css" -or -name "*.js" \
                            -or -name "*.appcache" \)  \
            -exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \;

    done

ただし、スクリプトを実行すると、sedは次のようになります。

sed: can't read : No such file or directory

StackOverflowで見つけた sed:読み込めません:そのようなファイルやディレクトリはありません しかし、すでに{}

sedコマンドをエコーし​​、コマンドラインで手動で実行してもエラーはありません。

Raspbian GNU/Linux 8.0(jessie)でGNU sed v4.2.2を使用しています

ここで間違っている可能性があるものを誰かが見ていますか?

22
Bas van Dijk

コメントから回答を編集するためのノウハウは、メルポメンとAlexPによるものです。

''の後のsed -iとは何ですか?

-iはインプレース、つまりファイルを直接編集することを意味します。
-i ''は、名前が空の文字列であるファイルをその場で編集することを意味します。
名前が空の文字列であるファイルはおそらくないので、sedはそれを読み取れないと文句を言います。

注1 プラットフォーム依存関係
-iの構文は、GNU sedとmacからのsedの違いの1つです。

注2 「通常の」引数の順序
sedコードがファイル名の間に挿入できることを示す-eスイッチ。
これは、sedコマンドラインのどこにあるかという期待を超えてトリップすることによる、trapです(たとえば、私は恥ずかしく思われました)。
許可
sed -i filename -e "expression" AnotherFileName
これは、意図せずに偽装されたバージョンです
sed -i'NoExtensionGiven' "expression" filename AnotherFileName

38
Yunnosch

OSXとLinuxの両方でサポートするには、bashスクリプトがOSXまたはLinuxで実行されているかどうかを確認する単純なifチェックを使用し、コマンドの-i引数はそれに基づいています。

if [[ "$OSTYPE" == "darwin"* ]]; then
  sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
else
  sed -i -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
fi
1
Acidic