regex - 使用 ACK 作为过滤器

标签 regex shell command-line filter ack

我一直在使用ACK用于搜索我的代码库,它是一个很棒的工具。然而,(在我看来)它有一个重要的限制 - 它不允许正则表达式的多行匹配。

为了克服这个限制,我想过滤一组包含特定表达式的文件,然后再次过滤它们以查找第二个表达式(假设两个表达式很可能不在同一行)。我尝试运行以下命令,但没有成功(它不返回任何内容):

ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String"

而且我不想使用 grep,因为我想将搜索限制为 java 文件,忽略 .cvs 目录、.svn 目录等(ack) > 默认情况下)有什么想法吗?

最佳答案

您当前的命令行正在文件列表上执行 ack,而不是使用匹配文件列表作为另一组要检查的文件。也就是说,这与执行相同

ack -l --type=java "(List|Collection|Map|Set)" > files
ack "String" files

xargs 是您要用来将第一个命令的输出视为可以运行第二个 ack 调用的一组文件的工具。

ack --print0 -l --type=java "(List|Collection|Map|Set)" | xargs -0 ack "String"

--print0 用空字符分隔文件名,以确保 xargs 获取正确的文件名(以防其中有奇数字符)。 xargs 的 -0 标志告诉它期望文件名以 null 分隔。

关于regex - 使用 ACK 作为过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850743/

相关文章:

javascript - 从扩展对象javascript创建 key 对对象

linux - awk 和数据流通过管道不起作用

linux - 在 linux 命令行中更改文本文件

regex - Django:重定向到正确大小写的 URL

java - 防止正则表达式与环视前后匹配?

bash - 如何使用 bash/expect 检查 SSH 登录是否有效

shell - Gitlab CI : How to pass error message from script

python - 如何为命令行命令设置别名? (苹果)

.net-core - 如何从命令行运行 .NET Core 控制台应用程序

javascript - 未包含在标签中的 url 的正则表达式