为什么我的正则表达式在 Mac OSX 上的 bash 脚本中使用 sed 不起作用?

zec*_*ude 5 osx bash sed regular-expression

我正在尝试CBX-1234从字符串CBX-1234--CBX-5678CBX-12345--CBX-5678. 我在 Mac OSX 上使用 bash 脚本使用 sed 来运行正则表达式。

string="CBX-1234--CBX-5678"
shortenedString=$(echo "$string" | sed "s/^([A-Za-z]+-[0-9]+)/\1/")
Run Code Online (Sandbox Code Playgroud)

这会输出以下错误消息:

sed: 1: "s/^([A-Za-z]+-[0-9]+)/\1/": \1 未在 RE 中定义

如何捕获子字符串?我愿意接受在 bash 中使用 sed 或其他方式的建议。

Kus*_*nda 12

您需要添加-Esed命令行以使其使用扩展的正则表达式:

sed -E 's/^([A-Za-z]+-[0-9]+)/\1/'
Run Code Online (Sandbox Code Playgroud)

如果您想要做的是将字符串缩短CBX-1234--CBX-5678CBX-1234,您还需要修改替换以将整个字符串考虑在内:

sed -E 's/^([A-Za-z]+-[0-9]+).*/\1/'
Run Code Online (Sandbox Code Playgroud)

您也可以使用bash参数扩展

shortenedString="${string%%--*}"
Run Code Online (Sandbox Code Playgroud)

$string将从第一次出现的--.

  • 只是想强调,如果没有 `-E`,**Mac 上的 sed 正则表达式真的很糟糕** - 像 `?` 和 `\1` 这样的基本东西不起作用,因为默认值是与古老的 `ed` 兼容的编辑器(20 世纪 70 年代复古)。甚至“man re_match”也将默认值描述为“过时的正则表达式”——所以真正的“扩展正则表达式”只是“正常的正则表达式”。 (5认同)
  • @RichVel 抱歉,您错了。如果没有 _non-standard_ `-E` 选项,`sed` 使用基本的正则表达式。扩展的正则表达式修饰符`?` 写成`\{,1\}` 和`\1` 如果你的捕获组看起来像`\( ... \)`。基本的正则表达式没有被淘汰,没有被“破坏”,并且在此处由 POSIX 标准解释:https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/V1_chap09.html#tag_09_03 (2认同)