it-swarm.com.de

Können Sie alle in grep zurückgegebenen Dateien massenweise bearbeiten?

Ich möchte eine Menge von Dateien, die in einem Grep zurückgegeben werden, massenbearbeiten. (Ich weiß, ich sollte bei sed besser werden).

Also wenn ich das tue:

grep -rnI 'xg_icon-*'

Wie leite ich all diese Dateien nach vi?

49
mager

Am einfachsten ist es, wenn grep nur die Dateinamen (-l statt -n) zurückgibt, die dem Muster entsprechen. Führen Sie das in einer Subshell aus und geben Sie die Ergebnisse an Vim weiter.

vim $(grep -rIl 'xg_icon-*' *)
74
jamessan

Eine gute generelle Lösung hierfür ist die Verwendung von xargs, um ein stdout von einem Prozess wie grep in eine Argumentliste zu konvertieren.

A la:

grep -rIl 'xg_icon-*' | xargs vi
21
Benj

wenn Sie vim und die Option -p verwenden, wird jede Datei auf einer Registerkarte geöffnet. Sie können zwischen ihnen mit gt oder gT oder sogar mit der Maus wechseln, wenn Sie im Terminal eine Mausunterstützung haben

7
user210574

Sie können dies ohne Verarbeitung der grep-Ausgabe tun! Dadurch können Sie sogar in die rechte Zeile gehen (mit :help quickfix-Befehlen, z. B. :cn oder :cw). Wenn Sie also bash oder zsh verwenden:

 vim -q & lt (grep foo * .c) 
6
Jaen

wenn das, was Sie bearbeiten möchten, in allen Dateien ähnlich ist, ist es nicht sinnvoll, vi manuell zu verwenden. (obwohl vi auch als Skript erstellt werden kann), sieht es hypothetisch so aus, da Sie nie erwähnen, was Sie bearbeiten möchten

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