с использованием диапазонов повторения {} с grep [closed]

$ grep a{2,} alphabet.txt
grep: a: No such file or directory
$cat alphabet.txt
abcdefghijklnmopqrstuvwxyz

Мой алфавит.txt содержит строку с буквой z. Разве {2,} не означает совпадение aaa *? Однако grep даже не работает.

1
задан 27 January 2017 в 08:22

1 ответ

Выйдите из своего шаблона Regex для предотвращения интерпретации оболочки заранее.

Вы использовали шаблон a{2,}, без любого выхода, поскольку это - допустимое bash шаблон расширения фигурной скобки это расширяется bash как a2 a.

Таким образом, в конечном счете, что grep добирается:

grep a2 a alphabet.txt

Как файл a не существует следовательно ошибка относительно него.


Просто выйдите из шаблона с помощью любого из обычных способов:

grep 'a{2,}' alphabet.txt
grep "a{2,}" alphabet.txt
grep a\{2,\} alphabet.txt

Здесь, использование одинарных кавычек рекомендуется, если у Вас нет переменной, Вы хотите расшириться - в этом случае используют двойные кавычки. Старайтесь избегать обратной косой черты, выходящей, как тот мог бы искаженный шаблоны и делать их нечитабельными, например, при выходе ДО (Расширенное регулярное выражение) маркеры в BRE (Основное Регулярное выражение); где Вам будет нужен к (blackslash) Escape дважды, чтобы заставить механизм рассматривать их как ДО маркеры.


Даже сейчас фигурные скобки рассматривали бы буквально потому что grep использованием по умолчанию механизм BRE, в то время как диапазон, соответствующий {} на самом деле ДО маркер. Таким образом, можно использовать -E опция рассматривать шаблон как ДО:

grep -E 'a{2,}' alphabet.txt

Или выйдите из фигурных скобок в BRE:

grep 'a\{2,\}' alphabet.txt

Как примечание стороны, Ваш входной файл не содержит два или больше последовательных aследовательно шаблон a{2,} никогда не будет соответствовать текущему входу.

9
ответ дан 3 December 2019 в 06:21

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

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