Ack-grep: символы избегают - PullRequest
20 голосов
/ 19 июня 2010

Моя цель - найти все "<?=" вхождения с помощью ack. Как я могу это сделать?

ack "<?="

Не работает. Пожалуйста, скажите мне, как я могу исправить побег здесь?

Ответы [ 4 ]

28 голосов
/ 19 июня 2010

Поскольку ack использует регулярные выражения Perl, ваша проблема связана с тем, что в языке Perl RegEx ? является специальным символом, означающим «последнее соответствие необязательно». Так что вы ищете, = предшествует необязательный <

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

Чтобы сбежать, есть два подхода - либо <\?=, либо <[?]=; некоторые люди считают, что вторая форма экранирования (помещение специального символа в класс символов) более читаема, чем обратная косая черта.

ОБНОВЛЕНИЕ Как любезно добавил Джош Келли в комментарии, третья форма экранирования заключается в использовании оператора \Q, который экранирует все следующие специальные символы до появления \E, а именно: \Q<?=\E

18 голосов
/ 19 июня 2010

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

12 голосов
/ 30 января 2015
ack -Q "<?="

Это лучшее решение, если вы хотите найти простым текстом.

(если вам не нужно искать по регулярному выражению.)

7 голосов
/ 19 июня 2010
ack "<\?="

?является оператором регулярных выражений, поэтому ему нужно экранировать

...