Проблема с вашим заданным регулярным выражением, .*
всегда имеет тенденцию быть жадным, пытаясь сопоставить самую длинную доступную строку. Таким образом, вторая попытка напрямую пытается соответствовать последовательности, которая присутствует в последней.
Вы можете настроить свое регулярное выражение ниже. Используйте инвертированную группу совпадений, чтобы сопоставить все, что не является последовательностью цифр, за которой следует символ %
, повторяйте это до тех пор, пока не появится первый шаблон, который равен последовательности цифр, за которым следует %
, и распечатайте его
sed 's/^[^0-9%]*\([0-9]*\)%.*/\1/'
Помните, что использовать awk
или perl
намного проще в подобных случаях. POSIX-ly awk
Функции соответствия регулярному выражению могут сделать это, как показано ниже. Функции match()
сканируют крайнюю левую подстроку, соответствующую регулярному выражению
awk 'match($0, /([[:digit:]]*)%/){ print substr($0, RSTART, RLENGTH-1) }'