HINWEIS: Die Verwendung sedist der geeignete Weg, um dies zu tun, wie aus der Antwort von @ Anthon hervorgeht !
Nur um Ihnen zu zeigen, wie Sie dies tun können vim. Sie können den argdoBefehl innerhalb verwenden vim. Von der :help argdoin vim:
:argdo[!] {cmd} Execute {cmd} for each file in the argument list.
Beispiel:
:args *.c
:argdo set ff=unix | update
Dies setzt die Option 'Dateiformat' auf "Unix" und schreibt die Datei, wenn sie jetzt geändert wird. Dies erfolgt für alle *.cDateien.
Beispiel:
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
Dadurch wird das Wort "my_foo" in allen *.cund *.hDateien in "My_Foo" geändert . Das "e" :substitute-Flag wird für den Befehl verwendet, um einen Fehler für Dateien zu vermeiden, in denen "my_foo" nicht verwendet wird. :updateschreibt die Datei nur, wenn Änderungen vorgenommen wurden.
Der Befehl gibt an :args <pattern>, für :argdowelche Dateien Sie Folgendes ausführen möchten {cmd}. Einmal definiert, führen Sie aus, :argdo {cmd} | updatewo {cmd}Ihre s/boy/Boy/gSubstitution sein kann.
Werden alle Dateien während dieses Vorgangs geöffnet?
Es scheint so. Ich habe den folgenden Test durchgeführt, um dies zu bestätigen.
$ for i in {1..3};do echo "dog" > file${i}.txt;done
$ head file*.txt
==> file1.txt <==
dog
==> file2.txt <==
dog
==> file3.txt <==
dog
Gehen Sie nun zu vimund führen Sie die folgenden Befehle aus:
:args file*.txt
Sie können bestätigen, dass alle geöffnet wurden:
:ls
2 %a "file1.txt" line 1
3 "file2.txt" line 0
4 "file3.txt" line 0
Tun Sie :argdo ...:
:argdo %s/dog/cat/g | update
"file1.txt" 1L, 4C written
"file2.txt" 1L, 4C written
"file3.txt" 1L, 4C written
Denken Sie also daran, wenn Sie diesen Ansatz verwenden möchten. Es öffnet ineffizient jede Datei, die Ihrem Muster entspricht, :argsund wendet den Befehl nacheinander auf sie an.