RegEx 替换适用于 Ruby gsub,但不适用于 sed
RegEx substitution works in Ruby gsub, but not with sed
我正在尝试从 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.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-]+)*))?$//g'
$ 1.2.3-alpha.4
我错过了什么?
我在 Mac OS X 上使用 zsh。
谢谢
如果你想把1.2.3-prefix.42
这样的字符串变成1.2.3
你就不用准备这么复杂的sed
表达式了。
只需检查字符串是否以由点分隔的三个数字的组合开头并捕捉它。然后,打印回来:
$ sed -r 's/^([0-9]\.[0-9]\.[0-9]).*//' <<< "1.2.3-prefix.42"
1.2.3
由于您在 Ruby 表达式中使用的其余模式使用 ?
我们可以假设它们是可选的,所以我不包括它们。
听起来你更喜欢ruby,你可以像sed一样使用它:
echo '1.2.3-prefix.42' | ruby.exe -ne 'puts $_.sub /[^\d.].+/, ""'
#=> 1.2.3
如果不需要,我认为您不会真的想学习 sed。
我正在尝试从 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.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-]+)*))?$//g'
$ 1.2.3-alpha.4
我错过了什么?
我在 Mac OS X 上使用 zsh。
谢谢
如果你想把1.2.3-prefix.42
这样的字符串变成1.2.3
你就不用准备这么复杂的sed
表达式了。
只需检查字符串是否以由点分隔的三个数字的组合开头并捕捉它。然后,打印回来:
$ sed -r 's/^([0-9]\.[0-9]\.[0-9]).*//' <<< "1.2.3-prefix.42"
1.2.3
由于您在 Ruby 表达式中使用的其余模式使用 ?
我们可以假设它们是可选的,所以我不包括它们。
听起来你更喜欢ruby,你可以像sed一样使用它:
echo '1.2.3-prefix.42' | ruby.exe -ne 'puts $_.sub /[^\d.].+/, ""'
#=> 1.2.3
如果不需要,我认为您不会真的想学习 sed。