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?
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?
Odpowiedzi:
Użyj, grep -laby pobrać nazwę pasującego pliku, a nie pasujący tekst, a następnie połączyć go z vim:
vim "$(grep -l some_pattern file_names)"
-qflagi of, grepaby upewnić się, że grep rzeczywiście doprowadził do jakiegoś pasującego pliku:grep -q patterns fnames && vim $(grep -l pattern fnames)
vinarzeka, PO nie może.
Możesz używać quickfixlub funkcjonować errorfilew vim:
$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list
Vim otworzy pierwszy plik /tmp/foo.listi umieści kursor bezpośrednio w linii, w której foozostał znaleziony. Możesz przejść do następnej instancji za pomocą :cni poprzedniej instancji za pomocą :cp.
Uwaga dodatkowa : jeśli już używasz vimlub gvim, sugerowałbym użycie jego wbudowanej grepfunkcjonalności. Przeczytaj, :help vimgrepaby uzyskać więcej informacji.
Do wyszukiwania w projekcie nie musisz zostawiać vima z Fugitive
autocmd QuickFixCmdPost *grep* cwindow
Poniżej możesz zobaczyć przykład :Ggrep config

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.
#!/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
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)"
vimżeby przeczytaćSTDIN:grep foo | vim -