Спички не перекрываются. Ваше регулярное выражение соответствует 2
. Заготовка после 2
исчезла. Это не будет рассматриваться для дальнейших матчей.
POSIX grep
не может делать то, что вы хотите в один шаг, но вы можете сделать что-то подобное в два этапа (упрощенный с вашего регулярного выражения, не поддерживает [lL]
)
grep -o ' [0-9 ]* ' | grep -E -o '[0-9]+'
То есть, соответствует последовательности числа, разделенные пробелами, с ведущими и конечными пробелами, и, следовательно, сопоставлять отдельные числа независимо от пробелов. Де-упростить определение номера в соответствии с вашими потребностями.
Perl-совместимых регулярных выражений есть способ, чтобы соответствовать вещи, не потребляя его, к примеру, как уже упоминалось в комментариях:
grep -oP " (0|[1-9]+[0-9]*)[Ll]?(?=)"
(?=)
является опережения утверждение, что означает grep
будет смотреть вперед в входной поток и убедитесь, что за соответствием следует пробел. Пространство не будет считаться частью матча и не будет использоваться. Если место не найдено, совпадение не выполняется.
PCRE не гарантированно работает во всех реализациях grep
.
Редактировать: -o
не указан Posix.
Вы потребляете пространство, когда вы соответствуете '2'. Попробуйте 'grep -oP '(0 | [1-9] + [0-9] *) [Ll]? (? =)" ' – 123
@ 123 Чтобы учесть начало/конец строк и удалить пробелы из вывода вы могли бы улучшить свое регулярное выражение так: 'grep -oP '(^ |) \ K ((0 | [1-9] + [0-9] *) [Ll]?) (? = | $) "' – Aserre
@Aserre Я целенаправленно не усложнил его как OP определенные слова как между двумя пробелами, но да, вы могли бы. – 123