一尘不染

需要多行搜索的正则表达式(grep)

linux

我运行一个grep发现有任何字*
.sql文件select后跟字customerName后面的字from。该select语句可以跨越很多行,并且可以包含制表符和换行符。

我已经尝试了以下几种变体:

$ grep -liIr --include="*.sql" --exclude-dir="\.svn*" --regexp="select[a-zA-Z0-
9+\n\r]*customerName[a-zA-Z0-9+\n\r]*from"

但是,这将永远持续下去。谁能用正确的语法帮助我?


阅读 716

收藏
2020-06-02

共1个答案

一尘不染

无需安装grep变体pcregrep,您可以使用grep进行多行搜索。

$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c

说明:

-P激活grep的perl-
regexp
(正则表达式的强大扩展)

-z禁止在行尾换行,用空字符代替。也就是说,grep知道行尾在哪里,但是将输入视为一条大行。

-o仅打印匹配项。因为我们使用-z,所以整个文件就像一条大行,因此,如果有匹配项,则将打印整个文件;这样就不会那样做。

在正则表达式中:

(?s)Activate PCRE_DOTALL,这意味着.找到任何字符或换行符

\N找到除换行符以外的任何内容,即使已PCRE_DOTALL激活

.*?``.在非贪婪模式下查找,即尽快停止。

^ 找到行的起点

\1向后引用第一组(\s*)。这是尝试找到方法的相同缩进的尝试。

可以想象,此搜索将主方法打印在C(*.c)源文件中。

2020-06-02