我有以下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
有人看到这里可能出现的问题吗?
答案 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