I’m running a grep
to find any *.sql file that has the word select
followed by the word customerName
followed by the word 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"
然而,这只是永远运行。任何人都可以帮我正确的语法吗?
原文由 Ciaran Archer 发布,翻译遵循 CC BY-SA 4.0 许可协议
无需安装 grep 变体
pcregrep
,您可以使用 grep 进行多行搜索。解释:
-P
为grep激活 perl-regexp (正则表达式的强大扩展)-z
将输入视为一组行,每行都以零字节(ASCII NUL 字符)而不是换行符结尾。也就是说,grep 知道行的末端在哪里,但将输入视为一条大行。请注意,如果与-o
一起使用,这还会添加一个尾随 NUL 字符,请参阅评论。-o
仅打印匹配。因为我们使用的是-z
,整个文件就像一个大行,所以如果匹配,就会打印整个文件;这样它就不会那样做。在正则表达式中:
(?s)
激活PCRE_DOTALL
,这意味着.
找到任何字符或换行符\N
找到除换行符以外的任何内容,即使PCRE_DOTALL
激活.*?
找到.
非贪心模式,即尽快停止。^
找到行首\1
反向引用第一组(\s*
)。这是一个尝试找到相同缩进的方法。正如您可以想象的那样,此搜索会打印 C (
*.c
) 源文件中的主要方法。