我有以下 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: can't read : No such file or directory 但我已经有 {} 附近的报价

当我回显 sed 命令并在命令行上手动执行它时,没有错误。

我在 Raspbian GNU/Linux 8.0 (jessie) 上使用 GNU sed v4.2.2

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

最佳答案

(从评论中编译答案,诀窍是 melpomene 和 AlexP。)
'' 之后的 sed -i 是什么?
-i 表示就地,即直接在文件中编辑。-i '' 表示就地编辑名称为空字符串的文件。
由于可能没有名称为空字符串的文件,sed 提示它无法读取它。

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

注意 2 参数 的“通常”顺序:
指示 sed 代码的 -e 开关允许将其置于文件名之间。
这是一个陷阱(例如,我在其中被尴尬地捕获了),它使您超出对在 sed 命令行中的位置的期望。
它允许sed -i filename -e "expression" AnotherFileName这是一个无意伪装的版本sed -i'NoExtensionGiven' "expression" filename AnotherFileName

关于bash - Sed 给出 : sed: can't read : No such file or directory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43171648/

10-13 09:37
查看更多