Як я можу відкрити файл, який є результатом grep?


17

Я часто збираю купу файлів, щоб знайти рядок, а потім grep повертає один результат. Замість того, щоб копіювати та вставляти ім'я файлу в нову команду, я хотів би мати можливість відкрити цей результат за допомогою редактора. Що - щось на кшталт: grep foo | vim. Чи є спосіб це зробити в BASH?


5
Ви були досить близькі, просто скажіть vimчитати з STDIN:grep foo | vim -
devnull

Відповіді:


20

Використовуйте grep -lлише для отримання імені відповідного файла, а не відповідного тексту, а потім комбінуйте його з vim:

vim "$(grep -l some_pattern file_names)"

Крім того, ви можете використовувати -qпрапор, grepщоб переконатися, що grep справді призвів до якогось відповідного файлу:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc

Чи варто робити зауваження щодо назви файлів з пробілами?
Бернхард

@Bernhard Це ніколи не зашкодить, а також про тих, хто має нові рядки та інших спеціальних символів. Я визнаю проблему, коли viскаржиться, ОП може не робити.
Антон

Не працює, якщо відповідні файли мають пробіли на своєму шляху
psuzzi

5

Ви можете використовувати quickfixабо errorfileфункціонувати в vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

Vim відкриє перший файл у /tmp/foo.listта розмістить курсор прямо у рядку, де його fooбуло знайдено. Ви можете перейти до наступного примірника, використовуючи :cnпопередній екземпляр, використовуючи :cp.

Бічна примітка : Якщо ви вже використовуєте vimабо gvim, я б запропонував використовувати його вбудований grepфункціонал. Прочитайте :help vimgrepдля отримання додаткової інформації.


1

Для пошуку в проекті не потрібно залишати vim з втікачем

autocmd QuickFixCmdPost *grep* cwindow

Нижче ви можете побачити приклад :Ggrep config

введіть тут опис зображення


0

EDIT: Прочитавши ваш коментар, я зрозумів, що спочатку не зрозумів питання. Ось простий скрипт, який сприймає пошуковий термін як аргумент і підказує шлях до пошуку. Якщо результат знайдений лише в одному файлі, він відкриє файл для редагування в місці пошуку результату.

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi

Але це, здається, дозволяє мені редагувати вихід grep, але те, що я хочу зробити, - це редагувати файл із назвою файлу, яке повертає grep.
Джонатан

0

@devnull отримав відповідь прямо у цьому коментарі:

Ви були досить близькими, просто скажіть vim, щоб читати з STDIN:

grep foo | vim -


0

Щоб розширити відповідь Ентона на випадок, коли у вас є більше одного збігу, в деяких випадках може бути корисно використовувати head -1цієї відповіді ) вибір лише першого результату:vim "$(grep -l STRING FILES|head -1)"


0

Якщо ви виконуєте довгу команду з грепом десь посередині, ви також можете це зробити

vim `command1 | grep whatever | awk '{do_something_else}'`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.