Sed 给出:sed:无法读取:没有这样的文件或目录
Sed gives: sed: can't read : No such file or directory
我有以下 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
在 Whosebug 上我找到了 sed: can't read : No such file or directory 但我已经在 {}
周围引用了
当我回显 sed
命令并在命令行上手动执行它时,没有错误。
我在 Raspbian GNU/Linux 8.0 (jessie)
上使用 GNU sed v4.2.2
有人看到这里可能出了什么问题吗?
(根据评论整理答案,melpomene 和 AlexP 的诀窍。)
sed -i
后面的 ''
是什么?
-i
表示in-place,即直接在文件中编辑。
-i ''
表示就地编辑文件,ose 名称为空字符串。
由于可能没有文件 whose name 是空字符串,sed 抱怨它无法读取它。
注释 1 平台依赖性:
-i
的语法是 GNU sed 和来自 mac os 的 sed 之间的一个区别。
注释 2 "usual" 参数顺序:
指示 sed 代码的 -e
开关允许将其放在文件名之间。
这是一个陷阱(例如,我很尴尬地陷入其中),让您超出您对在 sed 命令行中找到的内容的期望。
它允许
sed -i filename -e "expression" AnotherFileName
这是
的无意伪装版本
sed -i'NoExtensionGiven' "expression" filename AnotherFileName
。
为了支持 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
在我的 bash 脚本中,我使用了类似的东西(以支持 MacOS 和 Linux 发行版):
SEDOPTION=
if [[ "$OSTYPE" == "darwin"* ]]; then
SEDOPTION="-i ''"
fi
sed $SEDOPTION "/^*/d" ./file
我有以下 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
在 Whosebug 上我找到了 sed: can't read : No such file or directory 但我已经在 {}
当我回显 sed
命令并在命令行上手动执行它时,没有错误。
我在 Raspbian GNU/Linux 8.0 (jessie)
上使用 GNU sed v4.2.2有人看到这里可能出了什么问题吗?
(根据评论整理答案,melpomene 和 AlexP 的诀窍。)
sed -i
后面的 ''
是什么?
-i
表示in-place,即直接在文件中编辑。
-i ''
表示就地编辑文件,ose 名称为空字符串。
由于可能没有文件 whose name 是空字符串,sed 抱怨它无法读取它。
注释 1 平台依赖性:
-i
的语法是 GNU sed 和来自 mac os 的 sed 之间的一个区别。
注释 2 "usual" 参数顺序:
指示 sed 代码的 -e
开关允许将其放在文件名之间。
这是一个陷阱(例如,我很尴尬地陷入其中),让您超出您对在 sed 命令行中找到的内容的期望。
它允许
sed -i filename -e "expression" AnotherFileName
这是
的无意伪装版本
sed -i'NoExtensionGiven' "expression" filename AnotherFileName
。
为了支持 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
在我的 bash 脚本中,我使用了类似的东西(以支持 MacOS 和 Linux 发行版):
SEDOPTION=
if [[ "$OSTYPE" == "darwin"* ]]; then
SEDOPTION="-i ''"
fi
sed $SEDOPTION "/^*/d" ./file