Grep: соответствие буквальному "+"

Мне нужно найти вхождения «(+)» в моих сценариях sql (то есть в выражениях внешнего соединения Oracle). Понимая, что "+", "(" и ")" - все специальные символы регулярного выражения, я попробовал:

grep "\(\+\)" *

Теперь это действительно возвращает вхождения «(+)», но также и другие строки. (Казалось бы, все, что содержит открытые и закрывающие скобки в одной строке.) Вспомнив, что парные скобки используются только для расширенного grep, я попробовал:

grep "(\+)" *
grep "(\+)" *

Оба они вернули только строки, содержащие "()". Итак, предполагая, что "+" нельзя избежать, я попробовал старый трюк:

grep "([+])" *

Это работает. Я проверил результат с помощью инструмента без регулярных выражений.

Вопрос: Кто-нибудь может объяснить, что именно происходит со знаком «+»? Есть ли менее сложный способ сопоставления по "(+)"?

(Я использую команду cygwin grep.)

РЕДАКТИРОВАТЬ: Спасибо за решения. - И теперь я вижу, что, согласно руководству GNU grep, на которое ссылается Бруно, «\+» при использовании в выражении базовый дает «+» его значение расширенный и, следовательно, соответствует одному или нескольким "(" s, за которыми следует " ) ". И в моих файлах это всегда "()".

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 379
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вероятно, вам нужно добавить обратную косую черту, потому что оболочка их проглатывает.

ETA: На самом деле, я только что попробовал свой Cygwin, и grep "(+)", похоже, отлично подходит для того, что вы хотите.

Я просто попробовал grep -E "(\ +)" *, и это сработало. Так что, похоже, это не проблема оболочки. Может ли быть нарушено нерасширенное регулярное выражение cygwin?

Chris Noe 09.10.2008 23:30

Жаль, что можно принять только один ответ. Бруно провел меня через это, но вы тоже были правы. Я забыл, что «+» также используется только для расширенных регулярных выражений.

Chris Noe 09.10.2008 23:50

Нет, эти символы должны быть помещены в строку с двойными кавычками.

nobody 10.10.2008 19:14
Ответ принят как подходящий

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 разорван ??

Chris Noe 09.10.2008 23:35

Что дает grep --version? Для меня это работает для "grep (GNU grep) 2.5.1".

Bruno De Fraine 09.10.2008 23:39

Хм, здесь то же самое: grep (GNU grep) 2.5.1

Chris Noe 09.10.2008 23:40

А следующее не работает? echo -e "(+) \ n () \ n +" | grep "(+)"

Bruno De Fraine 09.10.2008 23:41

Ах, это работает! (Я не понимал, что вы опустили \ перед +) Итак, "+" также является расширенным регулярным выражением. Я упорно мышления был основным. БЛАГОДАРЯ.

Chris Noe 09.10.2008 23:45

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