sed给出:sed:无法读取:没有这样的文件或目录

时间:2017-04-02 18:01:09

标签: bash sed quoting gnu-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: can't read : No such file or directory但是我已经在{}附近引用了

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

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

有人看到这里可能出现的问题吗?

3 个答案:

答案 0 :(得分:28)

根据评论编写答案,专有技术是由melpomene和AlexP。

''之后的sed -i是什么?

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

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

注2 "通常"论证顺序
-e开关指示sed代码允许将其放在文件名之间 这是一个陷阱(例如,我尴尬地抓住了它),让你跳过对sed命令行所在位置的预期。
它允许
sed -i filename -e "expression" AnotherFileName
这是一个无意中被伪装的版本 sed -i'NoExtensionGiven' "expression" filename AnotherFileName

答案 1 :(得分:7)

要获得OSX和Linux的支持,我使用一个简单的if检查来查看bash脚本是否在OSX或Linux上运行,并根据该命令调整命令的-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

答案 2 :(得分:0)

在我的 bash 脚本中,我使用了类似的东西(以支持 MacOS 和 Linux 发行版):

SEDOPTION=
if [[ "$OSTYPE" == "darwin"* ]]; then
  SEDOPTION="-i ''"
fi

sed $SEDOPTION "/^*/d" ./file