【发布时间】:2016-02-28 21:48:31
【问题描述】:
我正在尝试从 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。
谢谢
【问题讨论】:
-
我相信非捕获组 (
(?: ... )) 在 sed 中不可用。更多信息:stackoverflow.com/questions/4823864/… -
虽然捕获组可能是您的主要问题,但如果 OSX 中
sed的库存安装支持\d,我会感到惊讶,请改用[0-9]。祝你好运。
标签: ruby regex sed zsh semantic-versioning