How to give a pattern for new line in grep?
Matthew Barrera
How to give a pattern for new line in grep? New line at beginning, new line at end. Not the regular expression way. Something like \n.
36 Answers
try pcregrep instead of regular grep:
pcregrep -M "pattern1.*\n.*pattern2" filenamethe -M option allows it to match across multiple lines, so you can search for newlines as \n.
grep patterns are matched against individual lines so there is no way for a pattern to match a newline found in the input.
However you can find empty lines like this:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 2 Thanks to @jarno I know about the -z option and I found out that when using GNU grep with the -P option, matching against \n is possible. :)
Example:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'Result:
barExample that involves matching everything including newlines:
.* will not match newlines. To match everything including newlines, use1 (.|\n)*:
grep -zoP 'foo\n\K(.|\n)*'<<<$'foo\nbar\nqux'Result:
bar
qux1 Seen here:
3You can use this way...
grep -P '^\s$' file-Pis used for Perl regular expressions (an extension to POSIXgrep).\smatch the white space characters; if followed by*, it matches an empty line also.^matches the beginning of the line.$matches the end of the line.
As for the workaround (without using non-portable -P), you can temporary replace a new-line character with the different one and change it back, e.g.:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'Basically it's looking for exact match _foo_ where _ means \n (so __ = \n\n). You don't have to translate it back by tr '_' '\n', as each pattern would be printed in the new line anyway, so removing _ is enough.
just found
grep $'\r'It's using $'\r' for c-style escape in Bash.
in this article
1