Ich habe mehrere Textdateien. Alle diese Textdateien müssen einer Bearbeitungsreihe unterzogen werden, die in ausgeführt werden kann vim
. Ich möchte das automatisieren. vim
hat mehrere Befehle zum Ersetzen. Angenommen, die Textdateien müssen wie folgt ersetzt werden:
- Junge durch Junge ersetzen:
%s/boy/Boy/g
- Mädchen durch Mädchen ersetzen:
%s/girl/Girl/g
- Leerzeilen löschen:
g/^$/d
Dies ist nur ein einfaches Beispiel. Gibt es eine Möglichkeit, all diese Regeln zu schreiben und diese dann für mehrere Dateien zu automatisieren?
Antworten:
Ja, es gibt eine Möglichkeit, dies zu automatisieren. Und es beginnt mit der Auswahl des richtigen Werkzeugs für den Job.
In diesem Fall sollten Sie zB verwenden
sed
und nicht versuchen, zu biegen,vi
was für den interaktiven Gebrauch (und nicht für die Automatisierung) ausgelegt ist.Die Ersetzungssyntax für
sed
ist weitgehend dieselbe wie fürvi
.quelle
sed
ist ein Stream - Editorvi
ist ein visueller Textdatei - Editor, gebaut oben aufex
/ed
(und ders
Befehl ist einex
Befehl invi
). Die meistensed
Implementierungen haben keine-i
.ex
unded
sind Standard-Unix-Befehle. Ja, es kann mit einigen Sed-Implementierungen durchgeführt werden, aber das heißt nicht, dass es das richtige Werkzeug ist.sed
ist "das richtige Werkzeug". Es gibt mehrere Werkzeuge, daher das "zB". Soweit ich mich erinnere,ed
wurden nicht mehrere Dateien bearbeitet, und Sie mussten Lese- und Schreibvorgänge für das Standardprogramm ausführen. Das letzte Mal, an das ich mich erinnern kann, dass ich es verwendet habe,ed
war, dassvi
es Mitte der 80er Jahre auf einem PDP-11 nicht verfügbar war, sodass ich möglicherweise mit seinen Funktionen nicht mehr auf dem neuesten Stand binVim-Skripte (gvim, vim) können elegant sein und sind sehr einfach anzupassen
wo edit.vim enthält (das: wq ist optional)
wo test.txt enthält
Hier ist ein generisches Vim-Skript zum Bereinigen einer "mucky" Textdatei
Denken Sie daran, dass Sie das Skript auch aus vim heraus beziehen können
quelle
Warum nicht verwenden
sed
?Mit sed können Sie leicht die Dateien im Verzeichnis durchlaufen:
Das obige Beispiel würde Junge-> Junge, Mädchen-> Mädchen ändern und die Zeilen leer löschen.
quelle
mv
ist unnötig. Verwenden Siesed
den-i.ext
Schalter, um ein Backup zu erstellen.Und ein Inline-
vi
Skript:quelle
HINWEIS: Die Verwendung
sed
ist 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
Beispiel:vim
. Sie können denargdo
Befehl innerhalb verwendenvim
. Von der:help argdo
invim
:Dies setzt die Option 'Dateiformat' auf "Unix" und schreibt die Datei, wenn sie jetzt geändert wird. Dies erfolgt für alle
Beispiel:*.c
Dateien.Dadurch wird das Wort "my_foo" in allen
*.c
und*.h
Dateien 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.:update
schreibt die Datei nur, wenn Änderungen vorgenommen wurden.Der Befehl gibt an
:args <pattern>
, für:argdo
welche Dateien Sie Folgendes ausführen möchten{cmd}
. Einmal definiert, führen Sie aus,:argdo {cmd} | update
wo{cmd}
Ihres/boy/Boy/g
Substitution 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.
Gehen Sie nun zu
vim
und führen Sie die folgenden Befehle aus:Sie können bestätigen, dass alle geöffnet wurden:
Tun Sie
:argdo ...
:Denken Sie also daran, wenn Sie diesen Ansatz verwenden möchten. Es öffnet ineffizient jede Datei, die Ihrem Muster entspricht,
:args
und wendet den Befehl nacheinander auf sie an.quelle
sed
ist das Werkzeug für Sie. Die meisten Befehle, die Sie verwendenvi
werden, sind in verfügbar,sed
und daher gibt es nicht viel Lernkurve. Die Befehlevi
, die mit a gestartet:
werden, basieren auf dem zugrunde liegenden Editored
und sind auch in verfügbarsed
. Sie verwenden diese Befehle ohne:
und werden standardmäßig auf die gesamte Datei angewendet. Zum Beispiel werden Sie für Ihr Beispiel tunquelle
Angenommen, Sie
vi
sind tatsächlichvim
odergvim
, es kann sicherlich in Vimscript implementiert werden, aber es kann kompliziert sein, mehrere Dateien gleichzeitig zu bearbeiten.Besser das richtige Werkzeug für den Job:
sed
Der Stream-Editor, der eine sehr ähnliche Syntax wie verwendetvi
, aber dazu gedacht ist, Dateien zeilenweise als Stream ohne Interaktion zu bearbeiten.Mit der Option
-i
,sed
können Sie Änderungen in mehreren Dateien.-i.backup moves an original file
foo.txtto
foo.txt.backup, and applies changes in place to
foo.txt`:Sie können dies auch innen ausführen
vi
mit:!
:quelle
Ich stimme @ Anthons Antwort zu . Verwendung
sed
:HINWEIS: (Dies löscht auch Zeilen mit nur Leerzeichen.)
Fügen Sie hinzu
-i
,sed
wenn Sie direkt ersetzen möchten (Ihre Dateien unterliegen der Versionskontrolle, oder?). Für mehrere Dateien:quelle
Alternativen
Es sei denn , Sie wirklich besondere Vim - Fähigkeiten benötigen, sind Sie wahrscheinlich besser mit nicht-interaktive Tools wie
sed
,awk
oder Perl / Python / Ruby - / Ihre Lieblingsskriptsprache hier .Sie können Vim jedoch nicht interaktiv verwenden:
Silent Batch-Modus
Verwenden Sie für eine sehr einfache Textverarbeitung (dh die Verwendung von Vim wie ein erweitertes 'sed' oder 'awk', das möglicherweise nur von den erweiterten regulären Ausdrücken in einem
:substitute
Befehl profitiert ) den Ex-Modus .Hinweis: Der stille Batch-Modus (
:help -s-ex
) bringt die Windows-Konsole durcheinander, sodass Sie möglicherweisecls
nach dem Ausführen von Vim eine Bereinigung durchführen müssen.Achtung: Vim wartet auf Eingabe, wenn die
"commands.ex"
Datei nicht existiert. besser vorher auf seine Existenz prüfen! Alternativ kann Vim die Befehle von stdin lesen. Sie können auch einen neuen Puffer mit aus stdin gelesenem Text füllen und Befehle aus stderr lesen, wenn Sie das-
Argument verwenden.Vollautomatisierung
Verwenden Sie für eine erweiterte Verarbeitung mit mehreren Fenstern und eine echte Automatisierung von Vim (bei der Sie möglicherweise mit dem Benutzer interagieren oder Vim laufen lassen, damit der Benutzer die Kontrolle übernimmt):
Hier ist eine Zusammenfassung der verwendeten Argumente:
quelle