Как я могу правильно избежать этого регулярного выражения в Bash? - PullRequest
4 голосов
/ 10 января 2012

Я пытаюсь запустить grep со следующим регулярным выражением:

(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"

Первая попытка:

$ grep -r -n  -H -E (?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\" ./
    -bash: !key: event not found

Хорошо, мне нужно убежать от "!" ...

$ grep -r -n  -H -E (?<\!key:)(?<\!orKey:)(?<\!isEqualToString:)\@\"[A-Za-z0-9]*\" ./
    -bash: syntax error near unexpected token `('

Хорошо, мне нужно убежать от "(" s ...

$ grep -r -n  -H -E \(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\" ./
    -bash: !key:)(?: No such file or directory

Хорошо, мне нужно процитировать строку?

$ grep -r -n  -H -E '\(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\"' ./

не возвращает результатов ... но я попробовал более простое регулярное выражение, которое не имеет утверждений с отрицательным просмотром, и оно работало нормально ... Я также использовал TextWrangler с этим регулярным выражением, и он работает, так что я могу только предположим, что я делаю что-то не так в командной строке здесь.

РЕДАКТИРОВАТЬ:

Если я использую опцию -p:

$ grep -r -n  -H -E -P '\(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\"' ./
grep: conflicting matchers specified

Пример содержимого файла, которое должно совпадать:

NSString * foo = @"bar";

Пример содержимого файла, которое НЕ должно совпадать:

return [someDictonary objectForKey:@"foo"];

Ответы [ 4 ]

5 голосов
/ 10 января 2012

В основе этого вы должны заключить в кавычки всю строку с ''. (Если вы приложите "", ! принесет вам горе). Тогда вам нужно только выйти из внутреннего ' в пределах вашего регулярного выражения (если есть).

Также вы хотите -P (perl) вместо -E (egrep) регулярное выражение.

grep -r -n -H -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' ./
4 голосов
/ 10 января 2012

попробуйте использовать параметр -P , который будет интерпретировать регулярное выражение как регулярное выражение perl.Также, если вы предоставите некоторые примеры ввода и вывода, это поможет получить ответ.

2 голосов
/ 10 января 2012

' цитирование работает отлично, пока в вашем выражении нет '. А у вас их нет, так что все будет хорошо.

Если вы действительно параноидально относитесь к цитированию, поместите выражение в файл и используйте вместо него grep -f FILENAME, чтобы оно считывало регулярное выражение из файла.

Но реальная проблема может заключаться в том, что вам нужно указать grep -P, чтобы явно запросить поддержку регулярного выражения Perl.

0 голосов
/ 10 января 2012

Работает нормально, просто избегайте использования конфликтующих опций.-

[jaypal:~/Temp] cat filename
NSString * foo = @"bar";
return [someDictonary objectForKey:@"foo"];

[jaypal:~/Temp] grep -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' filename
NSString * foo = @"bar";
...