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

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

我正在尝试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/")

这将输出以下错误消息:

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

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

答案1

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

sed -E 's/^([A-Za-z]+-[0-9]+)/\1/'

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

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

您也可以使用bash参数扩展

shortenedString="${string%%--*}"

$string这将删除第一次出现后的所有内容--

答案2

我总是用sed -r

$ echo "abhellocd" | sed -r "s/.*(hello).*/\1/g"
hello

从 sed 的手册页:

   -r, --regexp-extended
          use extended regular expressions in the script.

该选项-E不是我列出的。虽然它也有效。

答案3

您可以使用echo "$string" | cut -d "-" -f 1,2

相关内容