通过示例这将更容易解释。这是我的输入文件:
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 a
AND的文件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
我不确定,但这个细节对我来说并不重要。这是做什么的:
- 突出显示
- 结果上面文件的相对路径
- 这些功能
less
提供导航和搜索 - 它可以找到多个正则表达式 AND 在一起
- 该
-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 已经这样做了,但我对这两种情况都非常矛盾,因此,如果这些示例难以实现,我不介意突出显示在这些边缘情况下的工作方式是否不同;一般来说,我的正则表达式不会重叠。