If you want to search for two or more words that occur on multiple lines you can use ripgrep
's option --multiline-dotall
, in addition to to provide -U
/--multiline
. You also need to search for foo
before bar
and bar
before foo
using the |
operator:
rg -lU --multiline-dotall 'foo.*bar|bar.*foo' .
For any number of words you'll need to |
all permutations of those words. For that I use a small python script (which I called rga
) which searches in
the current directory (and downwards), for files that contain all arguments given on the commandline:
#! /opt/util/py310/bin/python
import sys
import subprocess
from itertools import permutations
rgarg = '|'.join(('.*'.join(x) for x in permutations(sys.argv[1:])))
cmd = ['rg', '-lU', '--multiline-dotall', rgarg, '.']
# print(' '.join(cmd))
proc = subprocess.run(cmd, capture_output=True)
sys.stdout.write(proc.stdout.decode('utf-8'))
I have searched successfully with six arguments, above that the commandline becomes to long. There are probably ways around that by saving the argument to a file and adding -f file_name
, but I never needed/investigated that.
rg -l 'SecondSearchPattern' $(rg -l 'FirstSearchPattern')
– Estus