如何通过 AND 模式递归搜索文件内容并像 ag/silver 搜索器一样打印输出?

如何通过 AND 模式递归搜索文件内容并像 ag/silver 搜索器一样打印输出?

通过示例这将更容易解释。这是我的输入文件:

file1:
x
x
a
b
c
x
x

file2:
x
x
c
b
a
x
x

file3:
x
x
x x a b c x x
x
x

file4:
x
x
x x c b a x x
x
x

file5:
x
x
a b
x
x

file6:
x
x
x x b c x x
x
x

file7:
x
x
x x b b x x
x
x

我想搜索具有 regexp aAND的文件c。这将返回文件 1-4。

我希望输出看起来尽可能接近 的ag -C <number> --pager="less -R" regexp输出。这就是它的样子(我用尖括号将结果括起来以表示颜色突出显示):

file1:
2: x
3: <a>
4: b
5: <c>
6: x

file2:
2: x
3: <c>
4: b
5: <a>
6: x

file3:
2: x
3: x x <a> b <c> x x
4: x

file4:
2: x
3: x x <c> b <a> x x
4: x

或者也许ag会像这样打印:

file1:
2: x
3: <a>
4: b
--
4: b
5: <c>
6: x

我不确定,但这个细节对我来说并不重要。这是做什么的:

  1. 突出显示
  2. 结果上面文件的相对路径
  3. 这些功能less提供导航和搜索
  4. 它可以找到多个正则表达式 AND 在一起
  5. -C选项仍然存在于命令行中

行号是很好的,但不是必需的。


我尝试了很多事情,这是我得到的最接近的:

第 1 步:预编译每个正则表达式的文件列表

for x in $array_of_regexp_file_names; 
  do r=${x/.txt/} ; # remove .txt from the end
  ag -il $r | sort > $x & ; # sort the list of FILES with this single regexp
done

这给出了每个正则表达式的文件列表,按文件名排序。

步骤2:使用ag搜索2+文件列表的交集

我将分解以下内容:

ag -C 1 --pager="less -R" "regexp1|regexp2" $(comm -12 regexp1.txt regexp2.txt)

$(comm -12 regexp1.txt regexp2.txt)

该命令查找路口两个文件列表。也就是这张图中的红色:

在此输入图像描述

ag -C 1 --pager="less -R" "regexp1|regexp2" ...

在这里,我给出了ag一个正则表达式知道存在于该交叉点的每个文件中。这可能看起来多余,但我这样做是因为希望这些单词在输出中突出显示。它让我的生活轻松了 1000 倍。

问题是:交集有很多文件,运行命令会给出以下输出:

zsh: argument list too long: ag

除此之外,我的解决方法有效。我已经通过运行如下命令对此进行了测试:

ag -C 1 --pager="less -R" "regexp1|regexp2" $(comm -12 patter1.txt regexp2.txt | head -10)

问题是相交列表太长,不适合命令行。如果ag提供了传递文件列表进行搜索的选项,我可以跳过这个,但它没有该功能。

无论如何,我希望我不需要:我假设这个问题有一个更简单的解决方案,我只是不知道它是什么。


编辑:为了巩固一些突出显示规则,这里有一些其他示例:

实施例1

正则表达式:

regex1 = a.
regex2 = .b

输入

file8:
x
x
abc
x
x

输出:

2: x
3: <ab>c
4: x

实施例2

正则表达式:

regex1 = foo
regex2 = oba

输入

file9:
x
x
foobar
x
x

输出:

2: x
3: <foo>bar
4: x

我选择这些输出是因为 grep 和 ag 已经这样做了,但我对这两种情况都非常矛盾,因此,如果这些示例难以实现,我不介意突出显示在这些边缘情况下的工作方式是否不同;一般来说,我的正则表达式不会重叠。

相关内容