Match a unix line ending with grep Match a unix line ending with grep unix unix

Match a unix line ending with grep


Your solution with grep -PUa '(?<!'$'\r'')$' worked with a more recent version of grep (2.25). However the support for Perl-compatible regular expression (-P) is stated to be highly experimental even in that newer version of grep, so it's not surprising that it didn't work in the previous version.

Use the following basic regular expression: \([^\r]\|^\)$, i.e. the following grep command when running from bash:

grep -Ua '\([^'$'\r'']\|^\)$'

An example demonstrating that it correctly handles both empty and non-empty lines:

$ printf "foo\nbar\r\n\nx\n\r\ny\nbaz\n" | grep -Ua '\([^'$'\r'']\|^\)$'fooxybaz$

EDIT

The solution above treats the last line not including an end-of-line symbol as if it ended with a unix line ending. E.g.

$ printf "foo\nbar" | grep -Ua '\([^'$'\r'']\|^\)$'foobar

That can be fixed by appending an artificial CRLF to the input - if the input ends with a newline, then the extra (empty) line will be dropped by grep, otherwise it will make grep to drop the last line:

$ { printf "foo\nbar"; printf "\r\n"; } | grep -Ua '\([^'$'\r'']\|^\)$'foo$