Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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.

share|improve this question
    
As Kent brilliantly deduced, yes, the text file was written on Windows. –  DarenW Sep 17 '13 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 '13 at 5:33
add comment

1 Answer

up vote 6 down vote accepted

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.

share|improve this answer
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 '13 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 '13 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 '13 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. –  Alexey Ivanov Sep 17 '13 at 5:57
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.