Bash脚本sed使用导致ZSH出现问题

Bash脚本sed使用导致ZSH出现问题,bash,shell,sed,zsh,Bash,Shell,Sed,Zsh,我有一个Bash脚本,用于拉入几个repo来创建项目工作流的一个新实例,它根据命令行提供的信息执行大量字符串替换 一位同事使用ZSH,并且遇到了一些问题,这些问题似乎是由于脚本中使用了sed。特别是它似乎没有处理正则表达式?例如 # Author Name. if [[ $authorname ]] then sed -i "" "s/Author Name/$authorname/g" "$file" fi 导致以下错误: sed: can't rea

我有一个Bash脚本,用于拉入几个repo来创建项目工作流的一个新实例,它根据命令行提供的信息执行大量字符串替换

一位同事使用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都友好的字符串替换?

如果这样做:

sed -i "" "s/Author Name/$authorname/g" "$file"
第一个参数
被视为正则表达式,其他参数被视为文件,因此您将得到错误

只需删除命令行的

或者,如果命令是动态的,则可以执行以下操作:

sed -i -e "" -e "s/Author Name/$authorname/g" "$file"

第一个正则表达式将被忽略。

假定您使用的是GNU
sed
,它不会像BSD
sed
那样采用
-i”“
模式来就地编辑文件

man sed

-i[后缀],--就地[=后缀]

您需要删除以下内容之间的空格:

sed -i"" "s/Author Name/$authorname/g" "$file"
或者,由于您不需要任何备份,只需执行以下操作:

sed -i "s/Author Name/$authorname/g" "$file"

不过,这将在*BSD上失败。没有一种跨平台使用
-i
的可移植方式。而且,
sed-i”“…
完全等同于
sed-i…
-i”“
,在删除引号后,与
-i
是同一个词。