Сложно извлечь цифры из строки, используя sed - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь извлечь информацию о версии строки, используя sed следующим образом:

echo "A10.1.1-Vers8" | sed -n "s/^A\([0-9]+\)\.\([0-9]\)\.[0-9]+-.*/\1/p"

Я хочу извлечь '10' после 'A'. Но вышеприведенное выражение не дает ожидаемой информации. Кто-нибудь может дать объяснение, почему это утверждение не работает?

Я попробовал вышеуказанную команду и изменил параметры os sed, но ничего не работает. Я думаю, что это какая-то синтаксическая ошибка

echo "A10.1.1-Vers10" | sed -n "s/^X\([0-9]+\)\.\([0-9]\)\.[0-9]+-.*/\1/p"

Ожидаемый результат - 10 На самом деле результат - Нет

Ответы [ 2 ]

2 голосов
/ 17 октября 2019
$ echo "A10.1.1-Vers8" | sed -r 's/^A([[:digit:]]+)\.(.*)$/\1/g'
10

Поиск строки, начинающейся с A (^A), за которой следуют несколько цифр (я использую класс символов POSIX [[:digit:]]+), которые захвачены в группе (), затембуквальной точкой \., за которой следует все остальное (.*)$.

Наконец, замените все содержимое Captured Group \1.

В GNU sed -r добавляет синтаксический сахар, на странице руководства он называется --regexp-extended

1 голос
/ 17 октября 2019

GNU grep является альтернативой sed:

$ echo "A10.1.1-Vers10" | grep -oP '(?<=^A)[0-9]+'
10

Опция -o указывает grep печатать только совпадающие символы.

-Pопция указывает grep на совпадение с регулярными выражениями Perl, что позволяет (?<= проверять утверждение нулевой длины.

проверочное утверждение (?<=^A) гарантирует наличие A в начале строки, ноне включает его как часть совпадения для вывода.

Если вам нужно сопоставить большее количество строки версии, вы можете использовать утверждение с упреждением:

$ echo "A10.1.1-Vers10" | grep -oP '(?<=^A)[0-9]+(?=\.[0-9]+\.[0-9]+-.*)'
10
...