需要多行搜索的正则表达式(grep)
我运行一个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"
但是,这将永远持续下去。谁能用正确的语法帮助我?
回答:
无需安装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
)源文件中。
以上是 需要多行搜索的正则表达式(grep) 的全部内容, 来源链接: utcz.com/qa/426379.html