如何使用 grep 打开文件名中带有空格的文件?

如何使用 grep 打开文件名中带有空格的文件?

我想在 .txt 文件中搜索短语,并使用 Sublime 文本打开找到的所有文件。我使用的是 Windows 版 Git Bash,经过多次试验后,我得到了以下结果.bashrc

# Alias for opening Sublime Text
alias subl='C:/Program\ Files/Sublime\ Text\ 3/sublime_text.exe'

# Search inside files and open them in Sublime Text
lookfor() {
    subl $(grep -rIl "$1" /c/wamp64/www/notes --exclude-dir="\.git")
}

我使用这样的脚本

lookfor lorem ipsum

该脚本仅适用于没有空格的文件名,如果有,则 Sublime 将为文件名中的每个单词打开一个新文件。

  1. 脚本如何正确打开grep找到的所有文件?
  2. 打开 Sublime Text 后,脚本如何停止执行并将控制权交还给我?目前,我需要关闭 Sublime,然后才能再次使用 bash

我尝试过其他各种代码来打开文件,但没有成功

grep -rlZ "lorem ipsum" ./* | xargs -0 subl
xargs: subl: No such file or directory

答案1

这个问题归结为这样一个事实,即 shell 参数使用未转义的空格作为分隔符,因此循环它们很棘手。

我认为最好的方法是以不同的方式处理换行符和空白符:

lookup() {
  while read f ; do
    test -f "$f" && subl "$f"
  done < <(grep -rIl "$1" /c/wamp64/www/notes --exclude-dir="\.git")
}

所以你读了结果逐行代替逐个标记从而将同一文件名的不同标记保存在一起。

编辑

对于应用程序来说,一次打开文件与逐个打开文件不同,这可以轻松适应:

lookup() {
  CMD="subl"
  while read f ; do
    test -f "$f" && CMD="$CMD '$f'"
  done < <(grep -rIl "$1" /c/wamp64/www/notes --exclude-dir="\.git")
  eval "$CMD"
}

相关内容