Я пытаюсь создать команду egrep к grep количество строк, содержащих определенный текст из текстового файла, но, казаться, иметь ошибку где-нибудь.
Текстовый файл содержит несколько тысяч строк и имеет выражение Lastname
в нескольких строках. Проблема, существуют также выражения как xLastname
или abcLastname
там, который я не хочу захватывать. Таким образом, определение RegExpression должно быть похожим на это:
ЛЮБОЙ там не текст вообще в строке прежде Lastname
появляется ИЛИ существует текст в строке, НО пространство должно быть между случайным текстом и Lastname
Я попробовал ((.+\ )?|(^.))Lastname
и ((.+\ )?|[^.])Lastname
но это всегда приводит к выражениям нахождения команды egrep как abcLastname
.
Где моя ошибка? Первая часть (.+\ )
("Если существует текст, должно быть пространство впоследствии"), кажется, хорошо работает, но вторая часть ("ИЛИ нет никакого текста вообще"), кажется, не работает.
Нет ли специальный символ, что я могу использовать для просто проверки если независимо от того, что прибывает после того, как это - ПЕРВОЕ выражение/символ в строке? Я не могу найти ту информацию онлайн, к сожалению.
Благодаря всем Вам заранее для Вашей справки
В первую очередь, Вы не должны выходить из пробелов, и Вы не должны вставлять parens ИЛИ выражение. Таким образом, regex из Вашего комментария упрощает до (.+ | |^)Lastname
.
Теперь, пространство является важной частью, таким образом, это далее упрощает до ( |^)Lastname
, который практически эквивалентен \bLastname
, где \b
граница слова.
Предотвратить соответствия как LastnameABC
, поместите другую границу слова в конец: \bLastname\b
. Или Вы могли использовать grep опцию -w
, который распознает только целые слова. Они эквивалентны:
grep -E '\bLastname\b'
grep -w Lastname
Кредит к steeldriver и PerlDuck для предложения их в комментариях
Основная проблема с regexes в Вашем вопросе состоит в том что первая группа (.+ )?
является дополнительным из-за вопросительного знака. Так ((.+ )?|^.)
упрощает до (|^.)
. Теперь, потому что первая часть ИЛИ является пустой, все это является эффективно пустым. Так (|^.)Lastname
упрощает до просто Lastname
.