Reputation: 3864
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.
Upvotes: 151
Views: 277301
Reputation: 2515
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:
bar
Example 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
qux
1 Seen here: https://stackoverflow.com/a/33418344
Upvotes: 50
Reputation: 71
just found
grep $'\r'
It's using $'\r'
for c-style escape in Bash.
in this article
Upvotes: 7
Reputation: 166427
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.
Upvotes: 8
Reputation: 1182
You can use this way...
grep -P '^\s$' file
-P
is used for Perl regular expressions (an extension to POSIX grep
).\s
match 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. Upvotes: 29
Reputation: 2558
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
Upvotes: 111
Reputation: 4137
try pcregrep
instead of regular grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
the -M
option allows it to match across multiple lines, so you can search for newlines as \n
.
Upvotes: 121