我正在尝试CBX-1234
从字符串CBX-1234--CBX-5678
或CBX-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
您需要添加-E
到sed
命令行以使其使用扩展正则表达式:
sed -E 's/^([A-Za-z]+-[0-9]+)/\1/'
如果您想要将字符串缩短CBX-1234--CBX-5678
为CBX-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
。