正则表达式匹配连字符之前的所有内容 - 多重匹配

Regex to match everything before hypen - multiple match

我得到这个字符串:

scQA00-psql11 scQA00-psql21 scQA01-psql2 scQA00-psql21
scqa00-psql01 scqa00-psql11 scqa00-psql21

我只想匹配:

scQA00 scQA00 scQA01 scQA00
scqa00 scqa00 scqa00

我试过:[^-]+ 但不能再进一步了:(

我也试过了(.*?)(?=-)+

但它只匹配第一次出现。

我怎样才能匹配连字符之前的所有内容但忽略空格?

如果要提取-之前所有由non-whitespace个字符组成的子串,可以使用

grep -Po '[^\s-]+(?=-)' file

regex demo[^\s-]+(?=-) 模式匹配除空格和 - 之外的任何一个或多个字符,后跟 -.

如果您只需要删除以 - 开头的字符串部分,直到下一个空格或字符串结尾,您可以使用 sed:

sed -E 's/-[^[:space:]]+//g' file

这里,-[^[:space:]]+ 匹配一个 - 然后一个或多个除空格以外的字符。

online demo:

text='scQA00-psql11 scQA00-psql21 scQA01-psql2 scQA00-psql21
scqa00-psql01 scqa00-psql11 scqa00-psql21'
grep -Po '[^\s-]+(?=-)' <<< "$text"
# scQA00
# scQA00
# scQA01
# scQA00
# scqa00
# scqa00
# scqa00
sed -E 's/-[^[:space:]]+//g' <<< "$text"
# scQA00 scQA00 scQA01 scQA00
# scqa00 scqa00 scqa00