2015-11-25 6 views
0

Я пытаюсь снять префиксы из SemVer, т. Е. Сделать 1.2.3-prefix.42 в 1.2.3.Замена RegEx работает в Ruby gsub, но не с sed

Я использую этот RegEx найти в 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-]+)*))? 

При использовании метода 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.

Благодаря

+2

Я считаю, что группы, не захватывающие захват ('(?: ...)'), недоступны в sed. Дополнительная информация: http://stackoverflow.com/questions/4823864/how-do-you-specify-non-capturing-brackets-in-sed –

+1

Хотя группы захвата, вероятно, вы основная проблема, я был бы удивлен, если установка пакета 'sed' в OSX поддерживает' \ d', вместо этого используйте '[0-9]'. Удачи. – shellter

ответ

1

Это звучит, как вы более комфортно с рубином, вы можете использовать его как СЭД:

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

Я не думаю, что вы действительно хотите научиться СЭД, если вам не нужно.

+0

Спасибо @pguardiario. Ведь «самый простой способ решить проблему - это не иметь ее в первую очередь». – mokagio

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-? мы можем предположить, что они не являются обязательными, поэтому я не включая их.

+0

Спасибо @fedorqui, но хотя правильный, ваш ответ не работает на складе 'sed' OS X. – mokagio

+0

@mokagio это странно! У меня нет такой версии здесь, вы можете захотеть добавить вывод, чтобы увидеть, чего не хватает, чтобы сделать его BSD совместимым. – fedorqui