Często grepuje kilka plików, aby znaleźć linię, a następnie grep zwraca jeden wynik. Zamiast kopiować i wklejać nazwę pliku do nowego polecenia, chciałbym móc otworzyć ten wynik w edytorze. Coś jak: grep foo | vim
. Czy jest na to sposób w BASH?
17
vim
żeby przeczytaćSTDIN
:grep foo | vim -
Odpowiedzi:
Użyj,
grep -l
aby pobrać nazwę pasującego pliku, a nie pasujący tekst, a następnie połączyć go zvim
:źródło
-q
flagi of,grep
aby upewnić się, że grep rzeczywiście doprowadził do jakiegoś pasującego pliku:grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
narzeka, PO nie może.Możesz używać
quickfix
lub funkcjonowaćerrorfile
wvim
:Vim otworzy pierwszy plik
/tmp/foo.list
i umieści kursor bezpośrednio w linii, w którejfoo
został znaleziony. Możesz przejść do następnej instancji za pomocą:cn
i poprzedniej instancji za pomocą:cp
.Uwaga dodatkowa : jeśli już używasz
vim
lubgvim
, sugerowałbym użycie jego wbudowanejgrep
funkcjonalności. Przeczytaj,:help vimgrep
aby uzyskać więcej informacji.źródło
Do wyszukiwania w projekcie nie musisz zostawiać vima z Fugitive
autocmd QuickFixCmdPost *grep* cwindow
Poniżej możesz zobaczyć przykład
:Ggrep config
źródło
EDYCJA: Po przeczytaniu twojego komentarza zdaję sobie sprawę, że początkowo nie rozumiałem pytania. Oto prosty skrypt, który traktuje wyszukiwane hasło jako argument i monituje o ścieżkę wyszukiwania. Jeśli wynik zostanie znaleziony tylko w jednym pliku, plik zostanie otwarty do edycji w miejscu wyniku wyszukiwania.
źródło
@devnull otrzymał odpowiedź w tym komentarzu:
źródło
Aby rozwinąć odpowiedź Anthona w przypadku, gdy masz więcej niż jedno dopasowanie, w niektórych przypadkach pomocne może być użycie
head -1
(z tej odpowiedzi ) wyboru tylko pierwszego wyniku:vim "$(grep -l STRING FILES|head -1)"
źródło
Jeśli wykonujesz długie polecenie, które ma grep gdzieś pośrodku, możesz to zrobić
źródło