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

新手上路,请多包涵

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 许可协议

阅读 636
2 个回答

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

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

解释:

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

-z 将输入视为一组行,每行都以零字节(ASCII NUL 字符)而不是换行符结尾。也就是说,grep 知道行的末端在哪里,但将输入视为一条大行。请注意,如果与 -o 一起使用,这还会添加一个尾随 NUL 字符,请参阅评论。

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

在正则表达式中:

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

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

.*? 找到 . 非贪心模式,即尽快停止。

^ 找到行首

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

正如您可以想象的那样,此搜索会打印 C ( *.c ) 源文件中的主要方法。

原文由 albfan 发布,翻译遵循 CC BY-SA 4.0 许可协议

我不太擅长grep。但是您的问题可以使用 AWK 命令解决。看看

awk '/select/,/from/' *.sql

上述代码将由 select from 第一个序列产生。现在您需要验证返回的语句是否具有 customername 。为此,您可以通过管道传输结果。并且可以再次使用 awk 或 grep。

原文由 Amit 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题