Thanks for pointing out the seeming inconsistency. The documentation mentions the issue but is perhaps not clear enough, so I installed the attached patch. The input file contains NUL bytes and so is treated as binary data, and the grep documentation (secton "File and Directory Selection", option "--binary-files") says "When processing binary data, ‘grep’ may treat non-text bytes as line terminators". This behavior was added to GNU grep in release 2.21 dated 2014, partly for performance reasons. There are two instances in riddle.he of a space followed by a NUL byte, so grep -P '[ \t]\r?$' riddles.he finds a match when the $ matches just before the NUL byte. -a is one way to get the behavior you evidently expected. Another (perhaps better) way is -z. The command: grep -zP '[ \t]\r?\n' riddles.he outputs nothing and exits with status 1.