实用程序grep可以在一行中搜索一个模式或多个模式,但有时这些多个模式可以分成多行(例如,保持前一行不超过80个字符的行)。有这么容易进行搜索吗?最好指定行范围参数,这意味着如果给定的模式出现在给定的行数范围内,则仅输出范围。
编辑:添加预期用量可能如下所示:
grep -l2 'abc.*def' file.txt
---将选择下面的模式
abc
def
---但不会选择低于模式。
abc
xxx
def
答案 0 :(得分:2)
好像您正在尝试打印范围内的行,即从abc
到def
。如果是,那么你可以使用下面的正则表达式。
grep -oPz '(?s)abc.*?def' file
(?s)
DOTALL模式,它在我们的正则表达式中转换点以匹配偶数换行符。
来自grep --help
-z, --null-data a data line ends in 0 byte, not newline
-P, --perl-regexp PATTERN is a Perl regular expression
-o, --only-matching show only the part of a line matching PATTERN
示例:强>
$ cat file
foo
abc
xxx
def
bar
$ grep -oPz '(?s)abc.*?def' file
abc
xxx
def
$ grep -oPz 'abc(.*\n){1}.*' file
abc
xxx
$ grep -oPz 'abc(.*\n){2}.*' file
abc
xxx
def
答案 1 :(得分:1)
假设这是输入:
cat file
foo
abc
xxx
def
bar
abc
def
baz
abc foo bar def
yyy
你可以使用这个awk:
awk '/abc/{p=NR;s=$0} /def/&&NR<=p+1{if (NR>p) print s; print $0}' file
abc
def
abc foo bar def
或者这个grep:
grep -ozP 'abc([^\n]*\n)?[^\n]*def' file
abc
def
abc foo bar def
这两个命令都会在abc
和def
之间找到文字,其中不超过一个可选的新行。