2017-01-21 5 views
1

Для сценария сборки Jenkins мне нужно удалить номер сборки из версии. Мне нужно в итоге MajorVersion.MinorVersion.BugfixVersion. Эти цифры не привязаны к одной цифре. Если у них уже есть три номера версии, ничего не должно произойти:Удалить номер сборки из версии: 1.3.0.342 должно стать 1.3.0

1.30.0.342 -> 1.30.0 
100.3.0.32 -> 100.3.0 
1.3.1234.3 -> 1.3.1234 
1.3.0 -> 1.3.0 

Как это сделать с помощью grep/sed?

Мой вход поступает с переменной

export VERSION="$(gulp config --silent --getWidgetAttr=version)" 
+2

Как выглядит ваш ввод? Является ли он в файле или уже в переменной оболочки? – chepner

ответ

4

Если вам нужны три секции (MajorVersion.MinorVersion.BugfixVersion)

вы могли бы получить это с "вырезать"

echo "1.30.0.342" | cut -d '.' -f1-3 
+0

Что означает '-f1-3'? – mles

+0

-f1-3 = поля от одного до трех – Vafa

1

С Grep , если переменные хранятся в infile:

$ grep -Eo '^([^.]+\.){2}[^.]+' infile 
1.30.0 
100.3.0 
1.3.1234 
1.3.0 

Это привязывает шаблон в начале строки, ищет «один или несколько не-периодов, за которым следует период» (повторяется дважды), а затем «один или несколько не-периодов», , Флаг -o сохраняет только согласованную часть.

В качестве альтернативы, в чистом (и неясного) Bash с расширением параметра (требуется расширенные шарики, shopt -s extglob):

$ vnum=1.3.1234.3 
$ echo "${vnum%"${vnum##+([[:digit:]]).+([[:digit:]]).+([[:digit:]])}"}" 
1.3.1234 
$ vnum=1.3.0 
$ echo "${vnum%"${vnum##+([[:digit:]]).+([[:digit:]]).+([[:digit:]])}"}" 
1.3.0 

Это сочетает в себе "удалить из конца строки", "${var%pattern}" с «удалить (самый длинный матч) из начало строки ", "${var##pattern}", где pattern для удаления с конца - это расширение« удалить из начального шаблона ».

extglob требуется, чтобы соответствовать «одному или нескольким» в +([[:digit:}}).

1

Вы можете сделать это, а также, используя здесь строку:

cut -f1-3 -d. <<< "1.30.0.342" 

Если номер сборки в переменном с именем build, то:

cut -f1-3 -d. <<< "$build" 

cut команда извлекает значения из разделителей строка текста.

  • -f1-3 => экстракт полей от 1 до 3
  • -d. =>. является разделителем, нет необходимости заключать его в кавычки
2

Если только извлечение 3-компонентные номера версий необходимо, без воздействия на их компоненты по отдельности, Vafa's helpful cut solution явно самый простой выбор.

Вот awk решения, которое может представлять интерес, если компонент-индивидуальной обработка необходима (внутри awk сценария, $1 представляет собой 1-ый компонент, $2 вторых, ...):

$ awk 'BEGIN { FS=OFS="." } { if (NF > 3) { NF = 3 } } 1' <<'EOF' 
1.30.0.342 
100.3.0.32 
1.3.1234.3 
1.3.0 
EOF 

1.30.0 
100.3.0 
1.3.1234 
1.3.0