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

Bas*_*ijk 24 bash sed quoting gnu-sed

我有以下bash脚本,对于找到的每个图像重复.它需要迭代所有html,cssjs文件,并替换该文件中所有出现的图像.

 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
Run Code Online (Sandbox Code Playgroud)

但是当我运行脚本时sed给出:

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

在StackOverflow上我发现sed:无法读取:没有这样的文件或目录但是我已经有了引号{}

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

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

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

Yun*_*sch 43

(根据评论编写答案,专有技术是由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.


sto*_*nth 10

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

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

sed $SEDOPTION "/^*/d" ./file
Run Code Online (Sandbox Code Playgroud)

  • 请解释一下这在现有答案之上提供的额外见解,尤其是@Acidic9 的答案。我看不出你的答案和那个答案之间有功能上的区别。另外,“我使用类似的东西”没有对这个仅代码答案提供解释。简而言之,请让您的贡献更加明显,以避免给人留下复制的印象,并在功能上进行了最小程度的、与功能无关的更改。 (2认同)
  • storenth 的答案更便携,并且随着您使用的 sed 命令越多,它就会变得越来越好,尽管我需要非 macOS 的“-i”选项。也就是说,这个解决方案在我的 macOS 上有一个奇怪的怪癖,它将“$SEDOPTION”中的引号附加到文件名中。我不得不诉诸以下黑客来防止这种情况...我尝试了许多其他方法,例如管道 xargs、交换单引号和双引号、反引号等,但这对我有用(`\x27` 代表单引号) : `if [[ "$OSTYPE" == "darwin"* ]]; 然后 SEDOPTION='-i \x27\x27'; 否则 SEDOPTION='-i'; 菲;` (2认同)

Aci*_*dic 5

为了获得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
Run Code Online (Sandbox Code Playgroud)

  • Linux 命名法也适用于 Windows 上的 msys。谢谢你的提示酸性。 (3认同)