Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Sed给出:Sed:can';t read:没有这样的文件或目录_Bash_Sed_Quoting_Gnu Sed - Fatal编程技术网

Bash Sed给出:Sed:can';t read:没有这样的文件或目录

Bash Sed给出:Sed:can';t read:没有这样的文件或目录,bash,sed,quoting,gnu-sed,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="i

我有下面的
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:无法读取:没有这样的文件或目录

在StackOverflow上,我找到了,但是我已经在
{}

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

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

有人知道这里可能有什么问题吗?

(根据评论编写答案,诀窍由melpomene和AlexP提供。)

在sed-i之后的
'
是什么

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

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

注2:参数的“通常”顺序: 用于指示sed代码的
-e
开关允许它位于文件名之间。
这是一个陷阱(例如,我在其中尴尬地被抓住),它使您对在sed命令行中找到的内容的期望过高。
它允许
sed-i文件名-e“表达式”另一个文件名

这是一个非故意伪装的版本

sed-i'NoExtensionGiven'“expression”文件名另一个文件名

对于OSX和Linux上的支持,我使用一个简单的if检查来查看bash脚本是否在OSX或Linux上运行,并基于此调整命令的
-I
参数

if[“$OSTYPE”==“darwin”*];然后
sed-i'-e的|$iconPath |图像主题暗/$iconfile | g'{}
其他的
sed-i-e的|$iconPath |图像主题为深色/$iconfile | g'{}
fi

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

sed选项=
如果[[“$OSTYPE”==“darwin”*];然后
sedpoption=“-i”
fi
sed$sedpoption“/^*/d”。/file

Btw:see:GNU sed和mac OS的sed之间有一个区别。
-i
之后的
''是什么?请在你的问题中添加OS和sed版本。@osi:GNU sed和mac OS的sed的语法。@osi:
-i
表示就地,即直接在文件中编辑<代码>-i''
表示就地编辑名称为空字符串的文件。由于您可能没有一个名称为空字符串的文件,
sed
抱怨它无法读取该文件。Linux术语在Windows上也适用于w/msys。谢谢你的提示。请在现有答案的基础上,特别是@Acidic9的答案,解释一下这篇文章提供的额外见解。我看不出你的答案和那个答案在功能上有什么不同。另外,“我使用类似这样的东西”并没有对此进行解释,否则代码只能给出答案。简言之,请让您的贡献更加明显,以避免给人留下抄袭的印象,并尽量少地、在功能上不相关地对其进行更改。