【问题标题】:.bash_profile sed: \1 not defined in the RE.bash_profile sed: \1 未在 RE 中定义
【发布时间】:2014-09-03 06:09:15
【问题描述】:

我必须在我的 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

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

sed: 1: "s|/usr/local/bin||; s|/ ...": \1 not defined in the RE

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

【问题讨论】:

    标签: sed homebrew .bash-profile


    【解决方案1】:

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

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

    一些sed的实现,比如GNU和BSD提供的,确实有一个指定使用ERE的扩展,但它是not specified by POSIX,如果你想便携就不能使用它。

    【讨论】:

    • +1;相反,使用 -E 启用对 extended 正则表达式的支持,其中 () 不需要(不得)被转义 - 适用于 OS X(OP 是on) 和 GNU/Linux(其中只有别名 -r记录)。
    • “sed 使用 BRE”是不正确的。可悲的是,它默认使用。 BRE 是古老且已弃用的,任何新使用的 sed 都应始终与 -E (OSX/BSD) 或 -r (GNU) 标志一起使用 ERE。
    • @ooga 现在用更正的信息更新了帖子。
    • 谢谢! \(.*\) 不会给我一个错误。但是现在整个echo 都写入了我的.bash_profile 0_0
    • 我猜这就是目的:将 .bash_profile 中定义的任何 PATH 带到那个点,然后在必要时重新修改它以绝对确保 /usr/local/bin:/usr/local/sbin 出现在开头.它专门取出对已经在 PATH 中的这两个目录的任何引用,然后在前面替换它们。
    猜你喜欢
    • 2015-03-20
    • 2021-09-16
    • 2012-04-22
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2020-08-18
    相关资源
    最近更新 更多