grep
не проверяет, соответствует ли его ввод заданному поисковому выражению.Grep находит подстрок входных данных, которые соответствуют поиску.
См .:
grep test <<< This is a test.
Входные данные не полностью совпадают с test
.Только часть входных совпадений,
This is a <strong>test</strong>.
, но этого достаточно для grep
для вывода всей строки.
Аналогично, когда вы говорите
grep -E '^Ha{1}' <<< Haaair
Ввод не совсем соответствует поиску, но часть его соответствует
<strong>Ha</strong>aair
, и этого достаточно.Обратите внимание, что синтаксис {n,m}
- это просто удобство: Ha{1}
в точности эквивалентен Ha
, Ha{3,}
равен Haaa+
, Ha{2,5}
равен Haa(a?){3}
равен Haaa?a?a?
и т. Д. Другими словами, {1}
не означает «ровно один раз», это просто означает «один раз».
То, что вы хотите сделать, это сопоставить Ha
, за которым не следует другой a
.У вас есть два варианта:
Если ваш grep
поддерживает PCRE, вы можете использовать отрицательный прогноз:
grep -P '^Ha(?!a)'
(?!a)
- утверждение нулевой длиныкак ^
. не соответствует никаким символамэто просто приводит к сбою в совпадении, если после первого есть a
.
Или вы можете сделать это простым и использовать отрицательный []
:
grep -E '^Ha([^a]|$)'
Где [^a]
соответствует любому отдельному символу, который не a
, а чередование с $
обрабатывает регистр без символов вообще.