Grep {n} Предыдущий элемент соответствует ровно n раз, мне неясно в случае "Hair", "Haair" и "Haaair" - PullRequest
0 голосов
/ 09 июня 2019

Предположим, есть три строки "Hair", "Haair" и "Haaair". Когда я использую grep -E '^ Ha {1}', он возвращает все три предыдущих слова, вместо этого я ожидал только "Hair" , как я просил вернуть строку, которая начинается с H и сопровождается буквой «а» ровно один раз.

1 Ответ

1 голос
/ 09 июня 2019

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, а чередование с $ обрабатывает регистр без символов вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...