将正则表达式从 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
我有一个 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