2016-12-07 2 views
1

Мне нужно найти слова.grep найти буквы между двумя пробелами

В моем задании слово определяется как буквы между двумя пробелами («bla»). Я должен найти decimalIntegerConstant, как this, но это должно быть слово.

Я использую

grep -E -o " (0|[1-9]+[0-9]*)([Ll]?) " 

, но он не работает на, например:

бла 0l labl 2 3 abla0La 0L sfdgpočítačsd

Выход

0l 
2 
0L 

, но 3 отсутствует.

+3

Вы потребляете пространство, когда вы соответствуете '2'. Попробуйте 'grep -oP '(0 | [1-9] + [0-9] *) [Ll]? (? =)" ' – 123

+0

@ 123 Чтобы учесть начало/конец строк и удалить пробелы из вывода вы могли бы улучшить свое регулярное выражение так: 'grep -oP '(^ |) \ K ((0 | [1-9] + [0-9] *) [Ll]?) (? = | $) "' – Aserre

+0

@Aserre Я целенаправленно не усложнил его как OP определенные слова как между двумя пробелами, но да, вы могли бы. – 123

ответ

1

Спички не перекрываются. Ваше регулярное выражение соответствует 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.

+0

Не дает ответа, этот код не будет работать для данных OP – 123

+0

@ 123 Ответ не обязательно определяется как «код, который работает из коробки», а скорее «полезная информация, которая помогает прийти к решению». Сказав это, не стесняйтесь downvote/flag, если вы считаете, что ответ плох. –

+0

Он не будет работать вообще, как есть. '+' не BRE. и posix grep не поддерживает '-o' – 123

Смежные вопросы