2009-11-11 7 views
44

Voglio modificare in massa una tonnellata di file che vengono restituiti in grep. (Lo so, dovrei stare meglio con sed).È possibile modificare in massa tutti i file restituiti in grep?

Quindi, se faccio:

grep -rnI 'xg_icon-*' 

Come faccio a tubo di tutti quei file in VI?

+0

ma non significa VI solo file aperti contemporaneamente? –

+0

No. È possibile aprire più file contemporaneamente. I comandi: next e: prev passeranno in rassegna l'elenco degli argomenti. Con l'attuale vi, dovrai salvare prima di cambiare i file. Con Vim, puoi ": set hidden" per cambiare i buffer senza dover prima salvare, ma tieni comunque avvisato se tenti di uscire con le modifiche non salvate. Inoltre, Vim ha: bnext e: comandi bprev per passare attraverso la lista buffer, che è un superset della lista degli argomenti. – jamessan

+0

Un'altra cosa da ricordare è che se stai modificando un numero enorme di file con vim, puoi usare qualcosa come il plugin vim BufExplorer per rivedere i buffer che hai aperto e sfogliare rapidamente tra loro. – Benj

risposta

65

Il modo più semplice è far sì che grep restituisca solo i nomi file (-l anziché -n) che corrispondono al modello. Eseguilo in una subshell e invia i risultati a Vim.

vim $(grep -rIl 'xg_icon-*' *) 
+1

Si noti inoltre che a vim non piace quando l'input standard proviene da una pipe, quindi quanto sopra è molto meglio di 'grep -rIl ... | vim'. –

+0

Vim è soddisfatto dello standard input quando lo invocate con 'vim -' –

+0

@Kaleb vim funziona molto bene quando proviene da una pipe. Basta non dimenticare la chiamata a xargs, in quel caso. Quando la pipa si riempie di contenuti e non di nomi di file, il nerd pagato risponde alla tua osservazione: non dimenticare il trattino. –

21

Una soluzione generale bello questo è di usare xargs per convertire uno stdout da un processo come grep per una lista di argomenti.

A la:

grep -rIl 'xg_icon-*' | xargs vi 
+0

Risposta molto utile per me, non da ultimo in quanto generalizza a programmi che non sono 'vi'. (Alcuni di noi non sono di quella tribù, ma la maggior parte delle domande di questa varietà puntano in modo abbastanza esplicito.) –

+1

Sul mio mac (in Terminale), dopo aver eseguito questo con vim, il mio terminale aveva alcuni problemi funky con stdin. Non è il caso con altre soluzioni. I personaggi non sono stati mostrati in modo visibile, ecc. Pensieri? –

1

se ciò che si desidera modificare è simile in tutti i file, quindi nessun punto utilizzando vi per farlo manualmente. (Anche se v'è possibile creare script pure), ipoteticamente, sembra qualcosa di simile, dal momento che non parlare di quello che si desidera modificare

grep -rnI 'xg_icon-*' | while read FILE 
do 
    sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk...) 
done 
6

se si utilizza vim e l'opzione -p, si aprirà ogni file in una scheda, e puoi passare da una all'altra usando gt o gT, o anche il mouse se hai il supporto per il mouse nel terminale

+0

Grazie mille! Questa funzione è fantastica! – ep3static

6

Puoi farlo senza alcuna elaborazione dell'output di grep! Ciò consente anche di andare sulla linea giusta (usando i comandi :help quickfix, ad esempio :cn o :cw). Quindi, se si utilizza bash o zsh:

 
vim -q <(grep foo *.c) 
+1

vim -q -c copen <(grep foo * .c) sembra essere ancora migliore – lkraav

0
vi `grep -l -i findthisword *` 
Problemi correlati