Подтвердить что ты не робот

Ack-grep: устранение символов

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

ack "<?="

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

ack -Q "<?="

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

(если вам не нужно найти регулярное выражение.)

Ответ 4

ack "<\?="

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