10

I have a problem with using ack-grep with a negative look ahead.

I am running this command:

ack-grep "paypal_responded(?!_at)"

but I am getting the error:

bash: !_at: event not found

I have tried adding backslashes in various places, but I'm also new to using ack & linux, so please treat me as a newbie with any instructions.

Thanks in advance.

Lesmana
  • 25,663
  • 9
  • 82
  • 87
TobyG
  • 1,692
  • 3
  • 21
  • 36

2 Answers2

18

Try ack-grep 'paypal_responded(?!_at)'

You need single-quote to avoid bash interpret ! as history expand command.

number5
  • 15,913
  • 3
  • 54
  • 51
4

The shell is interpreting the ! in your input as a command substitution:

$ ack-grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ !ac
ack-grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ 

You need to tell the shell that ! has no special meaning; there are two ways to do that:

ack-grep "paypal_responded(?\!_at)"

ack-grep "paypal_responded\(?\!_at\)"

or

ack-grep 'paypal_responded(?!_at)'

Single-quoted strings have fewer transformations applied to them:

$ ack-grep "s\!" /etc/passwd
$ ack-grep 's!' /etc/passwd
$ 
sarnold
  • 102,305
  • 22
  • 181
  • 238
  • I tried... ack-grep "paypal_responded(?\!_at)" .. but got the error... "ack-grep: Invalid regex 'paypal_responded(?\!_at)': Sequence (?\...) not recognized in regex; marked by <-- HERE in m/paypal_responded(?\ <-- HERE !_at)/" – TobyG Dec 05 '11 at 16:52
  • Sheesh, there's obviously more going on than I expected -- my simple examples worked exactly as I wanted, but the longer one with `(?!_at)` fails in horrible ways and it's easy to see why you were driving yourself nuts trying to make it work. `ack-grep "paypal_responded\(?\!_at\)"` works fine.... but I can't explain it. – sarnold Dec 06 '11 at 00:30