RipGrep 默认使用Rust RegEx crate。它非常好,但仍然缺少一些功能,即前瞻和后向引用。RipGrep 还支持PCRE2,它确实具有前瞻和后向引用,但必须专门编译(必须安装Rust 。)
$ cargo build --release --features 'pcre2'
关于在文件中搜索可能由换行符分隔的文本,默认 ripgrep 提供了一个多行选项:
$ rg multiline 'foo.*bar' # can be shortened to -U
但是,.
字符类型匹配除换行符以外的任何内容,因此必须专门匹配它们:
$ rg -U 'foo.*[\n\r]*.*bar' *.txt # troublesome...
这在涉及多行时会出现问题,因此另一种技术是使用一个选项来告诉.
也匹配换行符:
$ rg -U --multiline-dotall 'foo.*bar' *.txt
或使用选项设置来告诉.
也匹配换行符:
$ rg -U '(?s)foo.*bar' *.txt
结果:
$ echo -e 'foo\nbar' > file1.txt
$ echo -e 'foo\nbaz' > file2.txt
$ echo -e 'bar\nbaz' > file3.txt
$ rg -U '(?s)foo.*bar' file*.txt
file1.txt
1:foo
2:bar
为了找到所有带有 'foo' 而不是 'bar' 的文件,有必要使用look-ahead,或者更具体地说,使用负前瞻。只有编译了 PCRE2 支持的 RipGrep 才能工作:
$ rg -U --pcre2 '(?s)foo.*^(?!.*bar)'
file2.txt
1:foo