Come posso aprire un file risultante da grep?


17

Spesso grep un gruppo di file per trovare una riga, quindi grep restituisce un risultato. Invece di copiare e incollare il nome file in un nuovo comando, mi piacerebbe poter aprire quel risultato con un editor. Qualcosa come: grep foo | vim. C'è un modo per farlo in BASH?


5
Eri piuttosto vicino, basta dire vimdi leggere da STDIN:grep foo | vim -
Devnull

Risposte:


20

Utilizzare grep -lsolo per ottenere il nome file del file corrispondente e non il testo corrispondente, quindi combinarlo con vim:

vim "$(grep -l some_pattern file_names)"

Inoltre, puoi usare -qflag di grepper assicurarti che grep abbia effettivamente portato ad alcuni file corrispondenti:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc

Devo fare un'osservazione sui nomi dei file con spazi?
Bernhard,

@ Bernardo Non può mai far male, e anche per quelli con newline e altri personaggi speciali. Ho riconoscere il problema quando visi lamenta, l'OP non potrebbe.
Anthon,

Non funziona se i file corrispondenti hanno spazi nel loro percorso
psuzzi

5

È possibile utilizzare quickfixo errorfilefunzionalità in vim:

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

Vim aprirà il primo file /tmp/foo.liste posizionerà il cursore direttamente nella riga in cui è foostato trovato. Puoi passare all'istanza successiva usando :cne usando l'istanza precedente :cp.

Nota a margine : se stai già utilizzando vimo gvim, quindi suggerirei di utilizzare la sua grepfunzionalità integrata . Leggi :help vimgrepper maggiori informazioni.


1

Per la ricerca nel progetto non è necessario lasciare Vim con Fugitive

autocmd QuickFixCmdPost *grep* cwindow

Di seguito puoi vedere un esempio di :Ggrep config

inserisci qui la descrizione dell'immagine


0

EDIT: Dopo aver letto il tuo commento, mi rendo conto di non aver capito la domanda inizialmente. Ecco un semplice script che utilizza il termine di ricerca come argomento e richiede il percorso da cercare. Se il risultato viene trovato in un solo file, apre il file per la modifica nella posizione del risultato della ricerca.

#!/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

Ma questo sembra permettermi di modificare l'output di grep, ma quello che voglio fare è modificare il file con il nome file che grep restituisce.
Jonathan,

0

@devnull ha ottenuto la risposta giusta in questo commento:

Eri piuttosto vicino, dì semplicemente a Vim di leggere da STDIN:

grep foo | vim -


0

Per espandere la risposta di Anthon per un caso in cui hai più di una corrispondenza, in alcuni casi può essere utile utilizzare head -1(da questa risposta ) per selezionare solo il primo risultato:vim "$(grep -l STRING FILES|head -1)"


0

Se stai eseguendo un comando lungo che ha grep da qualche parte nel mezzo di esso puoi anche fare

vim `command1 | grep whatever | awk '{do_something_else}'`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.