Нуждаюсь в помощи на egrep regex

Я пытаюсь создать команду egrep к grep количество строк, содержащих определенный текст из текстового файла, но, казаться, иметь ошибку где-нибудь.

Текстовый файл содержит несколько тысяч строк и имеет выражение Lastname в нескольких строках. Проблема, существуют также выражения как xLastname или abcLastname там, который я не хочу захватывать. Таким образом, определение RegExpression должно быть похожим на это:

ЛЮБОЙ там не текст вообще в строке прежде Lastname появляется ИЛИ существует текст в строке, НО пространство должно быть между случайным текстом и Lastname

Я попробовал ((.+\ )?|(^.))Lastname и ((.+\ )?|[^.])Lastname но это всегда приводит к выражениям нахождения команды egrep как abcLastname.

Где моя ошибка? Первая часть (.+\ ) ("Если существует текст, должно быть пространство впоследствии"), кажется, хорошо работает, но вторая часть ("ИЛИ нет никакого текста вообще"), кажется, не работает.

Нет ли специальный символ, что я могу использовать для просто проверки если независимо от того, что прибывает после того, как это - ПЕРВОЕ выражение/символ в строке? Я не могу найти ту информацию онлайн, к сожалению.

Благодаря всем Вам заранее для Вашей справки

0
задан 26 August 2018 в 13:20

1 ответ

В первую очередь, Вы не должны выходить из пробелов, и Вы не должны вставлять parens ИЛИ выражение. Таким образом, regex из Вашего комментария упрощает до (.+ | |^)Lastname.

Теперь, пространство является важной частью, таким образом, это далее упрощает до ( |^)Lastname, который практически эквивалентен \bLastname, где \b граница слова.

Предотвратить соответствия как LastnameABC, поместите другую границу слова в конец: \bLastname\b. Или Вы могли использовать grep опцию -w, который распознает только целые слова. Они эквивалентны:

grep -E '\bLastname\b'
grep -w Lastname

Кредит к steeldriver и PerlDuck для предложения их в комментариях

Основная проблема с regexes в Вашем вопросе состоит в том что первая группа (.+ )? является дополнительным из-за вопросительного знака. Так ((.+ )?|^.) упрощает до (|^.). Теперь, потому что первая часть ИЛИ является пустой, все это является эффективно пустым. Так (|^.)Lastname упрощает до просто Lastname.

1
ответ дан 29 October 2019 в 01:13

Другие вопросы по тегам:

Похожие вопросы: