如何让 ripgrep 告诉我列表中的哪些表达式在文件系统上没有匹配项

问题描述

例如,假设我有搜索的字符串列表:

alfa bravo charlie delta nebuchadnezzar bartholomew

并且在我的存储库中有包含 alfabravocharliedelta文件,但是没有 文件包含nebuchadnezzarno 包含 bartholomew文件。那么我希望答案是:

nebuchadnezzar bartholomew

正如您可能猜到的,我正在寻找已弃用的东西。我最终使用了以下 Ruby 代码解决方法,因为在尝试 man rg 后我找不到解决方案。

%w[alfa bravo charlie delta nebuchadnezzar bartholomew].each do |word|
  command = 'rg ' + word
  if `#{command}` == ''  # execute the command,see if ripgrep found nothing
    puts word
  end
end

解决方法

当在简单的 shell 循环结构中找不到匹配项时,您可以使用 rg 的退出代码。从 docs 中,当找不到正则表达式的匹配项并且没有看到错误时,它似乎返回代码 1。采用它

for word in alfa bravo charlie delta nebuchadnezzar bartholomew; do
    rg "$word" >/dev/null 2>&1
    [ "$?" -eq 1 ] && printf '%s\n' "no match for $word"
done