我有一个Bash脚本,用于引入多个repos来创建项目工作流的新实例,该实例根据命令行提供的信息执行大量字符串替换。
一位同事使用ZSH,并且遇到的问题似乎是在脚本中使用sed
的结果。特别是它似乎没有处理正则表达式?例如......
# Author Name.
if [[ $authorname ]]
then
sed -i "" "s/Author Name/$authorname/g" "$file"
fi
导致以下错误:
sed: can't read "s/Author Name/$authorname/g" : No such file or directory
我们发现通过添加-e
标志,大多数字符串替换错误消失了,但是他仍然会收到一些“未找到”错误......
sed: can't read : No such file or directory
有没有更好的方法来执行Bash和ZSH友好的字符串替换?
答案 0 :(得分:1)
如果你这样做:
sed -i "" "s/Author Name/$authorname/g" "$file"
第一个参数""
被视为正则表达式,其他参数被视为文件,因此您将获得错误。
只需删除命令行的""
即可。
或者,如果你的命令是动态的,你可以这样做:
sed -i -e "" -e "s/Author Name/$authorname/g" "$file"
第一个正则表达式将被忽略。
答案 1 :(得分:1)
假设您正在使用GNU sed
,它不会像-i ""
那样采用类似模式来编辑BSD sed
等文件。
来自man sed
:
-i [SUFFIX], - in-place [= SUFFIX]
您需要删除其间的空格:
sed -i"" "s/Author Name/$authorname/g" "$file"
或者,由于您没有进行任何备份,只需执行以下操作:
sed -i "s/Author Name/$authorname/g" "$file"