Регулярное выражение для извлечения номера версии

#regex #sed

#регулярное выражение #sed

Вопрос:

Я хочу извлечь номер версии из ld -v команды, и я написал следующее sed выражение:

 ld -v | sed -r 's/. ([0-9|.] )/1/'
 

Однако это выводит 1 , который является последней цифрой номера версии. Результат, который я ожидаю, будет 2.35.1

Где я ошибся в своем регулярном выражении? Насколько я понимаю, . часть соответствует всем символам и пробелам и ([0-9|.] ) соответствует цифре или точке, а затем фиксирует это. 1 затем ссылается на захваченный бит.

Комментарии:

1. Попробуйте ld -v | awk '{print $NF}'

2. «Где я ошибся в своем регулярном выражении?» In . является жадным и соответствует всем символам, не совпадающим с оставшимся регулярным выражением. Результат: 1 символ соответствует [0-9|.] , следовательно, вывод 1 .

Ответ №1:

Используйте GNU grep следующим образом:

 ld -v | grep -Po '[d.] ' | head -n1
 

Вывод:

 2.25.1
 

Здесь grep используются следующие параметры:
-P : Используйте регулярные выражения Perl.
-o : Выводите только совпадения (по 1 совпадению на строку), а не целые строки.

[d.] : Любая цифра или буквенная точка, повторяющаяся 1 или более раз.

СМОТРИТЕ ТАКЖЕ:
grep руководство
perlre — регулярные выражения на Perl

Ответ №2:

С awk помощью не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное в GNU awk .

 ld -v | 
awk 'match($0,/([0-9] .){1,}[0-9] $/){print substr($0,RSTART,RLENGTH)}'
 

Объяснение: Добавление подробного объяснения выше.

 ld -v |                                ##Running ld -v command and sending output to awk program from here.
awk '                                  ##Starting awk program from here.
match($0,/([0-9] .){1,}[0-9] $/){     ##using match function to match digits followed by dot with 1 ore more occurrences and then digits till last of line.
  print substr($0,RSTART,RLENGTH)      ##Printing sub string of matched regex which prints from RSTART to till RLENGTH values.
}'
 

Ответ №3:

Используйте grep вместо этого с -o возможностью извлечения только соответствующего компонента:

 ld -v | grep -Eo '[0-9] (.[0-9] )*

Обратите внимание, что это также привязывает совпадение к концу строки.

Сам шаблон допускает любое количество  .  в нем. Как правило, номера версий имеют a  MAJOR  ,  MINOR  и  PATCH  - так что не более 2 .  , но в данном случае не помешает сопоставить больше.

Вы могли бы быть более конкретными и соответствовать только двум .  :

 ld -v | grep -Eo '[0-9] (.[0-9] ){0,2}

Примечание: в обоих случаях мы допускаем ситуации, когда в номере версии может отсутствовать  MINOR  и / или  PATCH  - например, версия 2.35, а не 2.35.1


Ответ №4:

Вы можете использовать

 ld -v | sed -rn 's/.  ([0-9.] ).*/1/p'
 

Подробные сведения

  • -r (или -E ) - включает синтаксис выражения POSIX ERE
  • -n - подавляет вывод строки по умолчанию
  • . ([0-9.] ).* - сопоставляет любой один или несколько символов, пробел, а затем записывает одну или несколько цифр . в группу 1, а затем любые нулевые или более символов
  • 1 - заменяет совпадение содержимым группы 1
  • p - выводит результат подстановки.

Обратите внимание, что это также привязывает совпадение к концу строки.

Сам шаблон допускает любое количество . в нем. Как правило, номера версий имеют a MAJOR , MINOR и PATCH - так что не более 2 . , но в данном случае не помешает сопоставить больше.

Вы могли бы быть более конкретными и соответствовать только двум . :


Примечание: в обоих случаях мы допускаем ситуации, когда в номере версии может отсутствовать MINOR и / или PATCH - например, версия 2.35, а не 2.35.1

Ответ №4:

Вы можете использовать


Подробные сведения

  • -r (или -E ) - включает синтаксис выражения POSIX ERE
  • -n - подавляет вывод строки по умолчанию
  • . ([0-9.] ).* - сопоставляет любой один или несколько символов, пробел, а затем записывает одну или несколько цифр . в группу 1, а затем любые нулевые или более символов
  • 1 - заменяет совпадение содержимым группы 1
  • p - выводит результат подстановки.

Примечание: в обоих случаях мы допускаем ситуации, когда в номере версии может отсутствовать MINOR и / или PATCH — например, версия 2.35, а не 2.35.1

Ответ №4:

Вы можете использовать


Подробные сведения

  • -r (или -E ) — включает синтаксис выражения POSIX ERE

  • -n — подавляет вывод строки по умолчанию

  • . ([0-9.] ).* — сопоставляет любой один или несколько символов, пробел, а затем записывает одну или несколько цифр . в группу 1, а затем любые нулевые или более символов

  • 1 — заменяет совпадение содержимым группы 1

  • p — выводит результат подстановки.

Обратите внимание, что это также привязывает совпадение к концу строки.

Сам шаблон допускает любое количество . в нем. Как правило, номера версий имеют a MAJOR , MINOR и PATCH — так что не более 2 . , но в данном случае не помешает сопоставить больше.

Вы могли бы быть более конкретными и соответствовать только двум . :


Примечание: в обоих случаях мы допускаем ситуации, когда в номере версии может отсутствовать MINOR и / или PATCH — например, версия 2.35, а не 2.35.1

Ответ №4:

Вы можете использовать


Подробные сведения

  • -r (или -E ) — включает синтаксис выражения POSIX ERE
  • -n — подавляет вывод строки по умолчанию
  • . ([0-9.] ).* — сопоставляет любой один или несколько символов, пробел, а затем записывает одну или несколько цифр . в группу 1, а затем любые нулевые или более символов
  • 1 — заменяет совпадение содержимым группы 1
  • p — выводит результат подстановки.