将正则表达式从 pcre 转换为 sed 以拆分字符串

Convert regex from pcre to sed to split strings

我有一个 PCRE 格式的正则表达式版本,但我无法使用匹配组将其与 sed 一起使用。

正则表达式:

((^[[:alnum:]]+.*)-(\d+\.\d+\.\d+-VERS|\d+\.\d+\.\d+))

输入:

aaa1-bbb2-ccc3-dddd4-ffff5-1.0.0-VERS
aaa1-bbb2-ccc3-dddd4-ffff5-11.22.33-VERS
zzz1-bbb2-ccc3-1.0.1
zzz1-1.0.1-VERS

预期输出:拆分字符串并分隔版本字符串

group2="aaa1-bbb2-ccc3-dddd4-ffff5"
group3="1.0.0-VERS"
group2="aaa1-bbb2-ccc3-dddd4-ffff5"
group3="11.22.33-VERS"
group2="zzz1-bbb2-ccc3"
group3="1.0.1"
group2="zzz1"
group3="1.0.1-VERS"

以上输出按预期工作here

但是,尝试使用与 sed 相同的版本是行不通的。我错过了什么?

echo "aaa1-bbb2-ccc3-dddd4-ffff5-11.22.33-VERS" | sed -E 's#((^[[:alnum:]]+.*)-(\d+\.\d+\.\d+-VERS|\d+\.\d+\.\d+))# #p'

我认为 sed 无法识别 \d。这适用于 OSX.

sed -E 's/([[:alnum:]]+.*)-([0-9]+\.[0-9]+\.[0-9]+|[0-9]+\.[0-9]+\.[0-9]+-VERS)/ /'

输入:

aaa1-bbb2-ccc3-dddd4-ffff5-11.22.33-VERS
aaa1-bbb2-ccc3-dddd4-ffff5-1.0.0-VERS
zzz1-bbb2-ccc3-1.0.1
zzz1-1.0.1-VERS

输出:

aaa1-bbb2-ccc3-dddd4-ffff5 11.22.33-VERS
aaa1-bbb2-ccc3-dddd4-ffff5 1.0.0-VERS
zzz1-bbb2-ccc3 1.0.1
zzz1 1.0.1-VERS

正如@Sundeep 指出的那样,\d+ 不适用于 sed,应该使用 [0-9]+

echo "aaa1-bbb2-ccc3-dddd4-ffff5-11.22.33-VERS" | sed -E 's#((^[[:alnum:]]+.*)-([0-9]+\.[0-9]+\.[0-9]+-VERS|[0-9]+\.[0-9]+\.[0-9]+))# #g'

为什么这么复杂的正则表达式?

$ sed -E 's/(.*)-([0-9.]+(-VERS)?)$/\t/' file
1.0.0-VERS      aaa1-bbb2-ccc3-dddd4-ffff5
11.22.33-VERS   aaa1-bbb2-ccc3-dddd4-ffff5
1.0.1   zzz1-bbb2-ccc3
1.0.1-VERS      zzz1

或:

$ sed -E 's/(.*)-([^-]+-[^-]+)$/\t/' file
1.0.0-VERS      aaa1-bbb2-ccc3-dddd4-ffff5
11.22.33-VERS   aaa1-bbb2-ccc3-dddd4-ffff5
ccc3-1.0.1      zzz1-bbb2
1.0.1-VERS      zzz1

取决于输入的输出结果 zzz1-bbb2-ccc3-1.0.1

这可能适合您 (GNU sed):

sed -r 'h;s/^(([[:alnum:]]+-?)+)-(([[:digit:]]+\.?){3}(-VERS)?)/group1=""/p;g;s//group3=""/p;d' file

然而,更简单的正则表达式是:

sed -r 'h;s/^(.*)-([0-9].*)/group1=""/p;g;s//group2=""/p;d' file