grep: сопоставление по буквальному "+" - PullRequest
2 голосов
/ 09 октября 2008

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

grep "\(\+\)" *

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

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

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

grep "([+])" *

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 09 октября 2008

GNU grep (который входит в Cygwin) поддерживает два синтаксиса для регулярных выражений: базовый и расширенный. grep использует базовые регулярные выражения, а egrep или grep -E использует расширенные регулярные выражения. Основное отличие от grep manual заключается в следующем:

В основных регулярных выражениях метасимволы ?, +, {, |, ( и ) теряют свое особое значение; вместо этого используйте версии с обратной косой чертой \?, \+, \{, \|, \( и \).

Так как вы хотите обычные значения символов ( + ), любая из следующих двух форм должна работать для вашей цели:

grep "(+)" *       # Basic
egrep "\(\+\)" *   # Extended
1 голос
/ 09 октября 2008

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

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

...