问题 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

有人看到这里可能有什么问题吗?


7159
2018-04-02 18:01


起源

顺便说一句:见: bash中单引号和双引号之间的区别 - Cyrus
那是什么 '' 后 sed -i? - melpomene
请在您的问题中添加操作系统和sed版本。 - Cyrus
@osi:语法 -i 是来自mac os的GNU sed和sed之间的一个区别。 - Cyrus
@osi: -i 手段 到位,即直接在文件中编辑。 -i '' 手段 编辑一个名称为空字符串的文件。因为你可能实际上没有一个名为空字符串的文件, sed 抱怨它无法阅读。 - AlexP


答案:


汇编了评论的答案,melpomene和AlexP的专业知识。

那是什么 '' 后 sed -i

-i 意味着就地,即直接在文件中编辑。
-i ''  表示编辑名称为空字符串的文件。
由于可能没有名称为空字符串的文件,因此sed会抱怨它无法读取它。

注1 平台依赖
的语法 -i 是来自mac os的GNU sed和sed之间的一个区别。

笔记2 参数的“通常”顺序
-e 切换以指示sed代码允许在文件名之间使用它。
这是一个陷阱(例如,我在这里陷入困境),让你跳过对sed命令行所在位置的期望。
它允许
sed -i filename -e "expression" AnotherFileName
这是一个无意中被伪装的版本
sed -i'NoExtensionGiven' "expression" filename AnotherFileName


12
2018-04-17 14:29