跨多行匹配关键字

时间:2014-12-05 06:54:26

标签: regex grep

实用程序grep可以在一行中搜索一个模式或多个模式,但有时这些多个模式可以分成多行(例如,保持前一行不超过80个字符的行)。有这么容易进行搜索吗?最好指定行范围参数,这意味着如果给定的模式出现在给定的行数范围内,则仅输出范围。

编辑:添加预期用量可能如下所示:

grep -l2 'abc.*def' file.txt

---将选择下面的模式

abc
def

---但不会选择低于模式。

abc
xxx
def

2 个答案:

答案 0 :(得分:2)

好像您正在尝试打印范围内的行,即从abcdef。如果是,那么你可以使用下面的正则表达式。

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

这两个命令都会在abcdef之间找到文字,其中不超过一个可选的新行