1

Я хотел бы найти фразу внутри файлов .txt и с помощью Sublime text открыть все найденные файлы. Я использую Git Bash для Windows, и после различных экспериментов это то, что я имею в .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 и вернуть мне контроль в bash? В настоящее время мне нужно закрыть Sublime и только тогда bash снова будет доступен

Я пробовал другой код для открытия файлов, но безуспешно

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

1 ответ1

3

Этот вопрос сводится к тому факту, что параметры оболочки используют неэкранированные пробелы в качестве разделителя, поэтому просто циклически проходить по ним сложно.

ИМХО лучший способ по-разному трактовать символы новой строки и пробелы:

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"
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .