Шаблон .[^<]*
соответствует любому символу с .
, а затем [^<]*
соответствует любому 0+ символу, кроме <
. Он соответствует .src
части, следовательно, необязательный \(\.src\)\?
не должен совпадать, и .src
попадает в Группу 1.
Если вы хотите исправить свой текущий код, просто сопоставьте цифры и точки после package-
с [0-9.]*
:
sed "s,.*>package-\([0-9.]*\)\(\.src\)\?\.tar.*<,\1,g"
^^^^^^^
См. онлайн демо
Если у вас есть GNU grep
, вы также можете использовать PCRE-шаблон, например
grep -oP ">package-\K\d+(\.\d+)+"
См. еще одну онлайн-демонстрацию . Здесь после совпадения >package-
текст удаляется из совпадения с помощью оператора \K
, а затем 1+ цифр с 1 или более повторениями .
и 1+ цифр сопоставляются и возвращаются с помощью -o
вариант.