Мне нужно найти вхождения «(+)» в моих сценариях sql (то есть в выражениях внешнего соединения Oracle). Понимая, что "+", "(" и ")" - все специальные символы регулярного выражения, я попробовал:
grep "\(\+\)" *
Теперь это действительно возвращает вхождения «(+)», но также и другие строки. (Казалось бы, все, что содержит открытые и закрывающие скобки в одной строке.) Вспомнив, что парные скобки используются только для расширенного grep, я попробовал:
grep "(\+)" * grep "(\+)" *
Оба они вернули только строки, содержащие "()". Итак, предполагая, что "+" нельзя избежать, я попробовал старый трюк:
grep "([+])" *
Это работает. Я проверил результат с помощью инструмента без регулярных выражений.
Вопрос: Кто-нибудь может объяснить, что именно происходит со знаком «+»? Есть ли менее сложный способ сопоставления по "(+)"?
(Я использую команду cygwin grep.)
РЕДАКТИРОВАТЬ: Спасибо за решения. - И теперь я вижу, что, согласно руководству GNU grep, на которое ссылается Бруно, «\+» при использовании в выражении базовый дает «+» его значение расширенный и, следовательно, соответствует одному или нескольким "(" s, за которыми следует " ) ". И в моих файлах это всегда "()".





Вероятно, вам нужно добавить обратную косую черту, потому что оболочка их проглатывает.
ETA: На самом деле, я только что попробовал свой Cygwin, и grep "(+)", похоже, отлично подходит для того, что вы хотите.
Жаль, что можно принять только один ответ. Бруно провел меня через это, но вы тоже были правы. Я забыл, что «+» также используется только для расширенных регулярных выражений.
Нет, эти символы должны быть помещены в строку с двойными кавычками.
GNU grep (который входит в Cygwin) поддерживает два синтаксиса регулярных выражений: базовый и расширенный. grep использует базовые регулярные выражения, а egrep или grep -E - расширенные регулярные выражения. Основное отличие от руководство по grep заключается в следующем:
In basic regular expressions the metacharacters
?,+,{,|,(, and)lose their special meaning; instead use the backslashed versions\?,\+,\{,\|,\(, and\).
Поскольку вам нужно значение обычный символов (+), для вашей цели должна работать любая из следующих двух форм:
grep "(+)" * # Basic
egrep "\(\+\)" * # Extended
Я только что обнаружил, что ваш второй пример работает, а не первый. Хм. Cygwin grep разорван ??
Что дает grep --version? Для меня это работает для "grep (GNU grep) 2.5.1".
Хм, здесь то же самое: grep (GNU grep) 2.5.1
А следующее не работает? echo -e "(+) \ n () \ n +" | grep "(+)"
Ах, это работает! (Я не понимал, что вы опустили \ перед +) Итак, "+" также является расширенным регулярным выражением. Я упорно мышления был основным. БЛАГОДАРЯ.
Я просто попробовал grep -E "(\ +)" *, и это сработало. Так что, похоже, это не проблема оболочки. Может ли быть нарушено нерасширенное регулярное выражение cygwin?