簡體   English   中英

ripgrep 查找包含多個單詞的文件,可能在不同的行?

[英]ripgrep to find files which contain multiple words, possibly on different lines?

如果我有如下文件:

cat file1.txt
foo
bar
cat file2.txt
foo
baz
cat file3.txt
bar
baz

是否有關於 ripgrep(或類似)的命令將搜索例如包含 foo 和 bar 的文件? 例如,它會顯示 file1.txt 而不是其他兩個文件? (注意 foo 和 bar 可能不在同一行。)

然后第二個問題,為了更花哨,我可以使用一些語法來計算帶有 foo 的文件,但如果它們也包含 bar,則排除它們? 所以例如它只會顯示file2.txt?

謝謝!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM