1

Я пытаюсь найти лучшее регулярное выражение для извлечения номера версии из строки. Например:

 echo "Version 1.2.4.1 (release mode)" | sed -ne 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p'

Проблема здесь в том, что он работает только в том случае, если номер версии имеет формат «abcd». Если кто-то решит добавить или удалить цифру («abcde», «abc»), он сломается. Поэтому я хотел бы проанализировать регулярное выражение и сказать sed, что я хочу:

(1 или более чисел, за которыми следует точка) x 1 или более раз, за которыми следует число.

Я не могу найти, как "сгруппировать" «1 или более чисел, за которыми следует точка», поэтому я могу сказать, что хочу этот шаблон хотя бы один раз. Я пробовал это, но это не работает:

\([0-9]\+\.\)\+

Есть идеи ?

2 ответа2

4

Попробуйте следующую команду «sed»:

$ echo "Version 1.2.4.1 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
1.2.4.1

Он использует синтаксис {i, j}, который выбирает выражение несколько раз между первым и последним числом. Там не должно быть никаких чисел в строке до номера версии.

Еще примеры:

$ echo "Version 1.2.4.1.6 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
1.2.4.1.6 
$ echo "Version 1.2 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
1.2 
$ echo "Version 1.2. (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
$ 

РЕДАКТИРОВАТЬ к комментариям:

$ echo "Version 1.2.4.1.90 (release mode)" | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p'
3

Попробуй это:

[0-9]+(\.[0-9]+)*

Это означает «сопоставить 1 или более цифр, а затем сопоставить любое число (точка + цифры)».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .