Sed дает: sed: не могу прочитать: нет такого файла или каталога

у меня есть следующие bash скрипт, который повторяется для каждого найденного изображения. Он должен перебирать все HTML-код, в CSS и 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: не могу прочитать: нет такого файла или каталога но я уже в кавычки {}

когда я Echo sed command и и выполнить его в командной строке вручную нет ошибки.

Я использую GNU sed v4.2.2 на Raspbian GNU / Linux 8.0 (jessie)

кто-нибудь видит, что здесь может быть не так?

1 ответов


(компиляция ответа из комментариев, ноу-хау Мельпомены и Алекса.)

что это '' после sed -i?

-i значит на месте, то есть, редактировать в файл напрямую.
-i '' - означает изменение в файл, чье имя является пустой строкой.
Поскольку, вероятно, нет файла, имя которого является пустой строкой, sed жалуется, что он не может его прочитать.

Примечание 1 зависимость:
Синтаксис -i является одним из различий между GNU sed и sed от mac os.

примечание 2."обычный" порядок аргументов:
The -e переключатель для указания кода sed позволяет иметь его между именами файлов.
Это ловушка (в которую я, например, попал смущенно), заставляя вас спотыкаться о свои ожидания того, что вы найдете в командной строке sed.
Это позволяет
sed -i filename -e "expression" AnotherFileName
что непреднамеренно замаскированная версия
sed -i'NoExtensionGiven' "expression" filename AnotherFileName.