To be precise
Some text begin Some text goes here. end Some more text
and I want to extract entire block that starts from "begin" till "end".
with awk we can do like
awk '/begin/,/end/' text.
How to do with grep?
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.Sign up to join this community
Updated 18-Nov-2016 (since grep behavior is changed: grep with -P parameter now doesn't support
$ anchors [on Ubuntu 16.04 with kernel v:4.4.0-21-generic])(wrong (non-)fix)
$ grep -Pzo "begin(.|\n)*\nend" file begin Some text goes here. end
note: for other commands just replace the '^' & '$' anchors with new-line anchor
With grep command:
grep -Pzo "^begin\$(.|\n)*^end$" file
If you want don't include the patterns "begin" and "end" in result, use grep with Lookbehind and Lookahead support.
grep -Pzo "(?<=^begin$\n)(.|\n)*(?=\n^end$)" file
Also you can use
\K notify instead of Lookbehind assertion.
grep -Pzo "^begin$\n\K(.|\n)*(?=\n^end$)" file
\K option ignore everything before pattern matching and ignore pattern itself.
\n used for avoid printing empty lines from output.
Or as @AvinashRaj suggests there are simple easy grep as following:
grep -Pzo "(?s)^begin$.*?^end$" file grep -Pzo "^begin\$[\s\S]*?^end$" file
(?s) tells grep to allow the dot to match newline characters.
[\s\S] matches any character that is either whitespace or non-whitespace.
And their output without including "begin" and "end" is as following:
grep -Pzo "^begin$\n\K[\s\S]*?(?=\n^end$)" file # or grep -Pzo "(?<=^begin$\n)[\s\S]*?(?=\n^end$)" grep -Pzo "(?s)(?<=^begin$\n).*?(?=\n^end$)" file
see the full test of all commands here (out of dated as grep behavior with -P parameter is changed)
^ point the beginning of a line and
$ point the end of a line. these added to the around of "begin" and "end" to matching them if they are alone in a line.
In two commands I escaped
$ because it also using for "Command Substitution"(
$(command)) that allows the output of a command to replace the command name.
-o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. -P, --perl-regexp Interpret PATTERN as a Perl compatible regular expression (PCRE) -z, --null-data Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) instead of a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.