4

I though I knew grep, but maybe not.

I want to find all lines in a file ending with ':' If I run

grep :$ ~/greptester.txt

but to my surprise, it gives no results. Sometimes I confuse '^' and '$', having to guess which is begin and which is end of line, but I checked and $ is indeed the end of a line.

After much screwing around, I accidently discovered that running

grep :.$ ~/greptester.txt

does give the expected results. Why?

Here is the text file:

test line one
1 line with a colon:
ignore this line
3456 some stuff:
cat: meow; dog: bark; horse: four (4) legs.
goat, 7 elephants

This happens both on Ubuntu and on a Windows machine with Cygwin.

2
  • As Kent brilliantly deduced, yes, the text file was written on Windows.
    – DarenW
    Sep 17, 2013 at 4:12
  • 2
    Don't forget to single-quote your patterns. Better be safe than sorry when there's chance for an expansion happening.
    – slhck
    Sep 17, 2013 at 5:33

1 Answer 1

6

Your file has \r\n (CR+LF) line endings (likely, created in windows?), whereas most UNIX files only end in \n (LF).

So, before grep sees the \n after the : character, there is the \r that it has to match with the . wildcard.

4
  • 2
    It's 2013 and we're still dealing with line ending nonsense. Humans, sheesh! Follow up question: why not make grep smart enough to ignore this detail?
    – DarenW
    Sep 17, 2013 at 0:37
  • You might check the version of grep you're using. In OSX, the default is to strip the CR characters, so it behaves as you would expect (:$ would match). It also has the option -U to not strip the CR, which is how your version apparently behaves by default.
    – Kent
    Sep 17, 2013 at 0:48
  • 4
    @darenw because \r is a real character and sometimes you may want to search for it (it's happened to me). Having grep arbitrarily decide that \r is somehow special is a BAD idea. What should it do with \t or any other escape character?
    – terdon
    Sep 17, 2013 at 1:17
  • @terdon Unless \r is followed by \n, in which case you, most likely, want to ingore \r and treat the entire sequence \r\n as one character — line end. Sep 17, 2013 at 5:57

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .