我运行一个grep发现有任何字* .sql文件select后跟字customerName后面的字from。该select语句可以跨越很多行,并且可以包含制表符和换行符。
grep
select
customerName
from
我已经尝试了以下几种变体:
$ grep -liIr --include="*.sql" --exclude-dir="\.svn*" --regexp="select[a-zA-Z0- 9+\n\r]*customerName[a-zA-Z0-9+\n\r]*from"
但是,这将永远持续下去。谁能用正确的语法帮助我?
无需安装grep变体pcregrep,您可以使用grep进行多行搜索。
$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c
说明:
-P激活grep的perl- regexp(正则表达式的强大扩展)
-P
-z禁止在行尾换行,用空字符代替。也就是说,grep知道行尾在哪里,但是将输入视为一条大行。
-z
-o仅打印匹配项。因为我们使用-z,所以整个文件就像一条大行,因此,如果有匹配项,则将打印整个文件;这样就不会那样做。
-o
在正则表达式中:
(?s)Activate PCRE_DOTALL,这意味着.找到任何字符或换行符
(?s)
PCRE_DOTALL
.
\N找到除换行符以外的任何内容,即使已PCRE_DOTALL激活
\N
.*?``.在非贪婪模式下查找,即尽快停止。
.*?``.
^ 找到行的起点
^
\1向后引用第一组(\s*)。这是尝试找到方法的相同缩进的尝试。
\1
\s*
可以想象,此搜索将主方法打印在C(*.c)源文件中。
*.c