#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
- заменяет совпадение содержимым группы 1p
- выводит результат подстановки.
Обратите внимание, что это также привязывает совпадение к концу строки.
Сам шаблон допускает любое количество .
в нем. Как правило, номера версий имеют a MAJOR
, MINOR
и PATCH
- так что не более 2 .
, но в данном случае не помешает сопоставить больше.
Вы могли бы быть более конкретными и соответствовать только двум .
:
Примечание: в обоих случаях мы допускаем ситуации, когда в номере версии может отсутствовать MINOR
и / или PATCH
- например, версия 2.35, а не 2.35.1
Ответ №4:
Вы можете использовать
Подробные сведения
-r
(или-E
) - включает синтаксис выражения POSIX ERE-n
- подавляет вывод строки по умолчанию. ([0-9.] ).*
- сопоставляет любой один или несколько символов, пробел, а затем записывает одну или несколько цифр.
в группу 1, а затем любые нулевые или более символов1
- заменяет совпадение содержимым группы 1p
- выводит результат подстановки.
Примечание: в обоих случаях мы допускаем ситуации, когда в номере версии может отсутствовать 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
— заменяет совпадение содержимым группы 1p
— выводит результат подстановки.