22

My goal is to find all "<?=" occurrences with ack. How can I do that?

ack "<?="

Doesn't work. Please tell me how can I fix escaping here?

James A Mohler
  • 11,060
  • 15
  • 46
  • 72
user80805
  • 6,088
  • 5
  • 28
  • 31

4 Answers4

29

Since ack uses Perl regular expressions, your problem stems from the fact that in Perl RegEx language, ? is a special character meaning "last match is optional". So what you are grepping for is = preceded by an optional <

So you need to escape the ? if that's just meant to be a regular character.

To escape, there are two approaches - either <\?= or <[?]=; some people find the second form of escaping (putting a special character into a character class) more readable than backslash-escape.

UPDATE As Josh Kelley graciously added in the comment, a third form of escaping is to use the \Q operator which escapes all the following special characters till \E is encountered, as follows: \Q<?=\E

DVK
  • 126,886
  • 32
  • 213
  • 327
20

Rather than trying to remember which characters have to be escaped, you can use -Q to quote everything that needs to be quoted.

Andy Lester
  • 91,102
  • 13
  • 100
  • 152
15
ack -Q "<?="

This is the best solution if you will want to find by simple text.

(if you need not find by regular expression.)

Junichiro Tobe
  • 151
  • 1
  • 4
8
ack "<\?="

? is a regex operator, so it needs escaping

Jamie Wong
  • 18,104
  • 8
  • 63
  • 81