.bash\u配置文件sed:\1未在RE中定义

.bash\u配置文件sed:\1未在RE中定义,sed,homebrew,.bash-profile,Sed,Homebrew,.bash Profile,我必须在我的OS X 10.9上设置本地web开发环境,并安装自制软件。指南中的下一步告诉我使用以下命令将逻辑添加到~/.bash\u配置文件中: echo "export PATH=\$(echo \$PATH | sed 's|/usr/local/bin||; s|/usr/local/sbin||; s|::|:|; s|^:||; s|(.*)|/usr/local/bin:/usr/local/sbin:\1|')" >> ~/.bash_profile &&am

我必须在我的OS X 10.9上设置本地web开发环境,并安装自制软件。指南中的下一步告诉我使用以下命令将逻辑添加到
~/.bash\u配置文件中:

echo "export PATH=\$(echo \$PATH | sed 's|/usr/local/bin||; s|/usr/local/sbin||; s|::|:|; s|^:||; s|(.*)|/usr/local/bin:/usr/local/sbin:\1|')" >> ~/.bash_profile && source ~/.bash_profile
当我在终端中输入它时,我得到:

sed: 1: "s|/usr/local/bin||; s|/ ...": \1 not defined in the RE
是否应该将导出路径=/usr/local/bin:/usr/local/sbin:$PATH
写入我的
.bash\u配置文件
?为什么会出现这种错误?

您应该使用
\(.*)
而不是
(.*)

sed
默认使用基本正则表达式(BRE),它使用
\(
\)
进行组捕获,而不仅仅是扩展正则表达式(ERE)中使用的
。由于您的表达式使用了
(.*)
而不是
\(.*)
,因此不会将其识别为组捕获,因此不会捕获任何内容供
\1
使用


一些
sed
实现,例如GNU和BSD提供的实现,确实有一个用于指定ERE使用的扩展,但是它是,如果您想要可移植,就不能使用它。

+1;相反地,使用
-E
启用对扩展正则表达式的支持,其中
不需要(不得)转义-在OSX(OP正在运行)和GNU/Linux(只有别名
-r
被记录)上都可以工作。“sed使用BRE”不是真的。可悲的是,它默认使用它们。BRE是古老且不受欢迎的,任何新的sed用法都应该始终使用-E(OSX/BSD)或-r(GNU)标志来使用ERE。@ooga现在用更正的信息更新了帖子。谢谢<代码>\(.*)不会给我错误。但是现在整个
echo
都被写入了我的
.bash\u配置文件
0\u 0我猜这就是我的意图:选择在.bash\u配置文件中定义的任何路径,然后在必要时对其进行返工,以确保
/usr/local/bin:/usr/local/sbin
出现在开头。它特别删除对路径中已经存在的这两个目录的任何引用,然后在前面替换它们。