tuxnani
tuxnani

Reputation: 3864

How to give a pattern for new line in grep?

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

Answers (6)

Johannes Riecken
Johannes Riecken

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

HHHartmann
HHHartmann

Reputation: 71

just found

grep $'\r'

It's using $'\r' for c-style escape in Bash.

in this article

Upvotes: 7

kenorb
kenorb

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

Manikandan Rajendran
Manikandan Rajendran

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

arash kordi
arash kordi

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

nullrevolution
nullrevolution

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

Related Questions