Похоже, вы пытаетесь получить 8
из 1-1.8
(где 8
- любая последовательность чисел), да? Если это так, я бы просто использовал:
echo /foo/bar/baz/1-1.8/sing/song | sed -e "s/.*\/1-1\.//" -e "s/[^0-9].*//"
Без сомнения, вы можете заставить его работать с одной sed
«инструкцией» (-e
), но иногда проще просто разбить ее на части.
Первый удаляет все от начала до * включительно 1-1.
, второй - от первого нечислового после этого до конца.
$ echo /foo/bar/baz/1-1.8/sing/song | sed -e "s/.*\/1-1\.//" -e "s/[^0-9].*//"
8
$ echo /foo/bar/baz/1-1.752/sing/song | sed -e "s/.*\/1-1\.//" -e "s/[^0-9].*//"
752
И, кроме того, на самом деле это как Я отлаживаю sed
регулярные выражения. Я помещаю простые в независимые инструкции (или независимую часть конвейера для других команд фильтрации), чтобы видеть, что делает каждая из них.
После вашего редактирования это также работает:
$ echo /foo/bar/baz/1-1.962/sing/song | sed -e "s/.*\/1-1\.\([0-9][0-9]*\).*/\1/"
962
Что касается вашего комментария:
В примере пути компоненты, отличные от числового, могут содержать числа, похожие на числовой компонент пути, который я перечислил, но не совсем то же самое. Я пытаюсь точно соответствовать компоненту, который является 1-1. и посмотрим, что такое некое число.
Команда из двух частей sed
, которую я вам дал, должна работать с цифрами в любом месте строки (до тех пор, пока после не найдется 1-1.
интересующей вас). Это потому, что он на самом деле удаляет до конкретной строки 1-1.
и затем из первой нечисловой). Если у вас есть примеры, которые не работают должным образом, добавьте их в вопрос в качестве обновления, и я исправлю ответ.