Есть несколько проблем с регулярным выражением:
- Как Sundeep отметил в комментариях,
^.*:.*:
будут соответствовать два или более колонн, так как .*
части может соответствовать полям разделителей («:»), как а также содержимое поля. Чтобы исправить это, используйте ^[^:]*:[^:]*:
(или, что то же самое, ^\([^:]:\)\{2\}
); см ноты на брекет выражений и основные против расширенного синтаксиса RE ниже)
[0-9]\{2\}
будет точно соответствовать две цифры, а не три
- Как вы поняли, это соответствует номера, начинающиеся с «5», а затем, кроме «0»
цифр
в результате этих проблем, шаблон ^.*:.*:[1-5][0-9]\{2\}:
будет соответствовать любой записи с UID или GID в диапазоне 100-599.
Чтобы сделать это правильно с помощью grep
, используйте grep -E '^([^:]*:){2}([1-4][0-9]{3}|5000):'
(снова см. Комментарии Sundeep).
[Добавлено в редактировании:] Относительно скобка выражения и какие ^
средство в них, вот соответствующий раздел re_format man page:
выражение в квадратных скобках представляет собой список символов, заключенных в «[]». Он обычно соответствует любому одиночному символу из списка (но см. Ниже). Если список начинается с '^', он соответствует любому одиночному символу (но см. Ниже ), а не остальную часть списка. Если два символа в списке разделены знаком «-», это сокращает весь диапазон символов между этими двумя (включительно) в последовательности сортировки, , например. '[0-9]' в ASCII соответствует любой десятичной цифре.
(кронштейн выражение может также содержать и другие вещи, как классы символов и классы эквивалентности, и есть все виды специальных правил о таких вещах, как, как включить символы, такие как «^», «-», «[», или "]" как часть списка символов, а не отрицание, указывающее диапазон, класс или конец выражения и т. д. На самом деле все это довольно беспорядочно.)
Относительно базового и расширенного синтаксиса RE: grep -E
использует «расширенный» синтаксис, который достаточно разный, чтобы помешать вам. Соответствующие отличия здесь заключаются в том, что в базовом RE символы «() {}» рассматриваются как буквенные символы, если не экранированы (если они экранированы, они рассматриваются как синтаксис RE, указывающий на группировку и повторение); в расширенном RE это обратное: они рассматриваются как синтаксис RE, если они не экранированы (если они экранированы, их обрабатывают как буквенные символы).
Вот почему я предлагаю ^\([^:]:\)\{2\}
в первой точке, но тогда на самом деле используйте ^([^:]*:){2}
в предлагаемом решении - первый - это базовый синтаксис, второй - расширенный.
Другая соответствующая разница - и поэтому я перешел на продленный на фактическое решение - это то, что только расширенный RE позволяет |
указать альтернативы, как в this|that|theother
(который соответствует «это» или «что» или «theother «). Мне нужна эта возможность для соответствия четырехзначному номеру, начиная с 1-4 или определенного количества 5000 ([1-4][0-9]{3}|5000
). Просто нет возможности сделать это в базовом RE, так что grep -E
и расширенный синтаксис требуются здесь.
(Есть также много других вариантов RE, таких как RERE-совместимый RE (PCRE). При использовании регулярных выражений всегда обязательно узнайте, какой вариант использует ваш инструмент regex, поэтому вы не используете синтаксис, t понимают.)
'. *' жадный .. проверьте, совпадают ли цифры в других полях – Sundeep
Я должен смотреть только на третье поле, так как мой диапазон граничит с обеих сторон: ' –
не обязательно как есть и другие ':' в строке – Sundeep