0

我正在尝试从 SemVer 中去除前缀​​,1.2.3-prefix.42即将1.2.3.

我正在使用https://github.com/mojombo/semver/issues/32#issuecomment-7663411中的这个正则表达式:

^(\d+\.\d+\.\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?

使用 Ruby 的gsub方法时,它可以工作:

puts '1.2.3-alpha.4'.gsub(/^(\d+\.\d+\.\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/, '\1')
# => 1.2.3

但是当使用sed终端形式时,它不会:

$ echo '1.2.3-alpha.4' | sed -e 's/^(\d+\.\d+\.\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/\1/g'
$ 1.2.3-alpha.4

我错过了什么?

我在 Mac OS X 上使用 zsh。

谢谢

4

2 回答 2

2

如果你想制作像1.2.3-prefix.42变成这样的字符串,1.2.3你不必准备这么复杂的sed表达式。

只需检查字符串是否以由点分隔的三个数字的组合开头并抓住它。然后,打印回来:

$ sed -r 's/^([0-9]\.[0-9]\.[0-9]).*/\1/' <<< "1.2.3-prefix.42"
1.2.3

由于您在 Ruby 表达式中使用的其他模式使用?我们可以假设它们是可选的,所以我不包括它们。

于 2015-11-25T23:55:09.187 回答
1

听起来你更喜欢 ruby​​,你可以像 sed 一样使用它:

echo '1.2.3-prefix.42' | ruby.exe -ne 'puts $_.sub /[^\d.].+/, ""'
#=> 1.2.3

如果你不需要,我认为你真的不想学习 sed。

于 2015-11-26T04:47:26.267 回答