.bash_profile sed:\ 1未在RE中定义

ley*_*nnx 42 homebrew sed .bash-profile

我将在OS X 10.9上设置本地Web开发环境并安装Homebrew.我的指南中的下一步告诉我~/.bash_profile使用以下命令向我添加逻辑:

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
Run Code Online (Sandbox Code Playgroud)

当我在终端输入时,我得到:

sed: 1: "s|/usr/local/bin||; s|/ ...": \1 not defined in the RE
Run Code Online (Sandbox Code Playgroud)

export PATH=/usr/local/bin:/usr/local/sbin:$PATH应该写给我的.bash_profile吗?为什么我会收到这个错误?

Chr*_*ung 87

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

sed使用基本正则表达式(BRE)默认情况下,它使用\(\)对组拍摄,不只是()在扩展正则表达式(ERE)使用.由于您使用(.*)\(.*\)是表达式,因此不会将其识别为组捕获,因此不会捕获任何内容以供使用\1.

某些sed实现(例如GNU和BSD提供的实现)确实具有用于指定ERE使用的扩展,但它没有由POSIX指定,如果您想要可移植,则不能使用它.

  • +1; 相反,使用`-E`来支持_extended_正则表达式,其中`(`和`)`不需要(必须)不被转义 - 适用于OS X(OP所在的)和GNU/Linux (但是只有别名`-r`是_documented_). (27认同)
  • “sed 使用 BRE”是不正确的。可悲的是,它*默认*使用它们。BRE 是古老的且已弃用,任何新的 sed 使用都应始终与 -E (OSX/BSD) 或 -r (GNU) 标志一起使用 ERE。 (2认同)
  • 谢谢!`\(.*\)` 不会给我错误。但现在整个 `echo` 被写入我的 `.bash_profile` 0_0 (2认同)