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