Я часто grep кучу файлов, чтобы найти строку, а затем grep возвращает один результат. Вместо того, чтобы копировать и вставлять имя файла в новую команду, я хотел бы иметь возможность открыть этот результат с помощью редактора. Что - то вроде: grep foo | vim
. Есть ли способ сделать это в BASH?
17
vim
чтобы читать сSTDIN
:grep foo | vim -
Ответы:
Используйте,
grep -l
чтобы просто получить имя файла соответствующего файла, а не соответствующий текст, а затем объединить его сvim
:источник
-q
флаг of,grep
чтобы убедиться, что grep действительно привел к некоторому соответствующему файлу:grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
жалуюсь, ОП не может.Вы можете использовать
quickfix
или использоватьerrorfile
вvim
:Vim откроет первый файл
/tmp/foo.list
и поместит курсор прямо в строку, гдеfoo
был найден. Вы можете перейти к следующему экземпляру, используя:cn
и предыдущий экземпляр, используя:cp
.Примечание : если вы уже используете
vim
илиgvim
, то я бы предложил использовать встроенныеgrep
функции. Читайте:help vimgrep
для получения дополнительной информации.источник
Для поиска в проекте не нужно оставлять vim с Fugitive
autocmd QuickFixCmdPost *grep* cwindow
Ниже вы можете увидеть пример
:Ggrep config
источник
РЕДАКТИРОВАТЬ: После прочтения вашего комментария, я понимаю, что изначально я не понял вопрос. Вот простой скрипт, который принимает ваш поисковый термин в качестве аргумента и запрашивает путь для поиска. Если результат найден только в одном файле, он открывает файл для редактирования в том месте, где находится результат поиска.
источник
@devnull получил ответ прямо в этом комментарии:
источник
Чтобы расширить ответ Anthon для случая, когда у вас более одного совпадения, в некоторых случаях может быть полезно использовать
head -1
(из этого ответа ) выбор только первого результата:vim "$(grep -l STRING FILES|head -1)"
источник
Если вы выполняете длинную команду, где где-то посередине есть grep, вы также можете выполнить
источник