Bas*_*ijk 24 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
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)
为了获得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)