Моя цель - найти все "<?=" вхождения с помощью ack. Как я могу это сделать?
ack "<?="
Не работает. Скажите, пожалуйста, как я могу исправить здесь?
Ответ 1
Так как ack использует регулярные выражения Perl, ваша проблема связана с тем, что в языке Perl RegEx ? используется специальный символ, означающий, что "последнее совпадение является необязательным". Итак, для grepping для = предшествует необязательный <
Итак, вам нужно избежать ?, если это просто означает, что это обычный символ.
Чтобы выйти, существует два подхода: либо <\?=, либо <[?]=; некоторые люди находят вторую форму экранирования (помещая специальный символ в класс символов) более читабельным, чем обратный слэш-побег.
ОБНОВЛЕНИЕ. Когда Джош Келли любезно добавил в комментарий, третья форма экранирования заключается в использовании оператора \Q, который избегает всех следующих специальных символов до тех пор, пока \E не встретится, как показано ниже: \Q<?=\E
Ответ 2
Вместо того, чтобы пытаться запомнить, какие символы должны быть экранированы, вы можете использовать -Q для цитирования всего, что должно быть указано.
Ответ 3
ack -Q "<?="
Это лучшее решение, если вы захотите найти простой текст.
(если вам не нужно найти регулярное выражение.)
Ответ 4
ack "<\?="
? является оператором регулярных выражений, поэтому ему требуется экранирование