Wie kann man eine Zeile effizient in mehrere Zeilen aufteilen?

11

Ich habe protokollierte Daten in einer Textdatei empfangen, die nur eine lange Zeile enthält, wobei jeder Wert durch ein Leerzeichen getrennt ist. Gibt es einen Befehl oder eine Reihe von Befehlen, die eine Zeile in mehrere Zeilen aufteilen?

Dom
quelle

Antworten:

20

Mit dem Befehl können Sie einfach jedes aufeinanderfolgende Leerzeichen in der Zeile durch eine neue Zeile ersetzen :s/\s\+/\r/g. \s\+bedeutet ein oder mehrere Leerzeichen und \rist eine neue Zeile, siehe :help :substituteund :help regexpfür Details. Wenn Sie den Befehl in einer Zeile wie der folgenden ausführen:

foo bar baz

Du erhältst:

foo
bar
baz

Wenn Sie hlsearchaktiviert haben und Ihren Bildschirm nicht überall mit hervorgehobenen Leerzeichen überladen möchten, können Sie eine kleine Funktion wie die folgende schreiben, um dies zu vermeiden:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction
toro2k
quelle
"Wenn Sie Ihren Bildschirm nicht überall mit hervorgehobenen Leerzeichen überladen möchten", wird zu viel vom Setup des OP vorausgesetzt.
Romainl
@romainl Besser?
Toro2k
1
Ja, es ist besser IMO.
Romainl
2
Es ist \r, sehen Sie :help s/\r. Es könnte durch eine wörtliche Newline-Eingabe ersetzt werden <c-v><cr>. In diesem Zusammenhang \nist ein Nullzeichen, siehe :help s/\n.
Toro2k
1
replaces the content of the register- welches Register?
Stillanoob
5

Die Verwendung vimder Substitution ist wahrscheinlich eine der besseren Möglichkeiten, um Ihre Aufgabe zu erfüllen, aber Sie können auch ein Makro verwenden. Angenommen, wir haben die folgenden Daten, wobei sich der Cursor irgendwo in Zeile 1 befindet:

1 a b c d e f
~

Wenn Sie im normalen Modus qqstarten , wird durch Drücken ein Makro aufgezeichnet, das über aufgerufen werden kann @q. Alles, was danach eingegeben qqwird, kann über den oben genannten Anruf wiederholt werden. Unser Ziel ist es, normale Befehle aufzuzeichnen, die allgemein genug sind, um eine nahtlose Wiederholung zu ermöglichen.

Daher können wir eingeben 0, um den Cursor an den Anfang der Zeile zu bringen und dann fspaceden Cursor an die erste Stelle zu bewegen. Dies ermöglicht es uns, dann zu tippen renter, was zu Folgendem führt:

1 a
2 b c d e f
~

qJetzt zu schlagen ist eine gute Idee, da unser wiederverwendbares Makro zur Wiederholung bereit ist. Etwas willkürlich stellen wir fest, dass noch 4 Leerzeichen durch Zeilenumbrüche zu ersetzen sind. Wenn 4@qwir also drücken, wiederholen wir das qMakro viermal, was zu Folgendem führt:

1 a
2 b
3 c
4 d
5 e
6 f
~

Beachten Sie, dass es aufgrund der Art und Weise, wie wir das Makro eingerichtet haben, sicher gewesen wäre, den Befehl über 9000 Mal zu wiederholen, da dies nur die aktuelle Zeile betrifft und da rechts von der letzten Dateneingabe keine Leerzeichen vorhanden fspacesind 'schön' scheitern und verhindern, dass Daten durch Zeilenumbrüche ersetzt werden.

Also von Anfang an wiederholen:

qq0fspacerenterq9001@q

liefert unser Ergebnis.

HAL 9001
quelle
1
Ich finde es toll, dass Sie eine 9001Taste auf Ihrer Tastatur haben, mit der Sie Ihren Benutzernamen schnell eingeben können.
Rich
4

Der einfachste Weg, Linien in Vim zu teilen, ist der Befehl für den normalen Modus gq(geben Sie beide Buchstaben im normalen oder visuellen Modus schnell hintereinander ein).

Im visuellen Modus wird alles geteilt, was ausgewählt ist. Im normalen Modus folgen Sie gqeiner Bewegung.

Teilt beispielsweise gqleine Zeile auf die aktuell eingestellte Breite. Um die Breite der geteilten Linien so einzustellen, dass sie sich von Ihrer aktuellen Einstellung unterscheidet, können Sie verwenden :set textwidth=n, wobei ndie Anzahl der Zeichen in einer Zeile angegeben wird, z. B., 10und nach Abschluss wieder auf Ihre normale Breite zurückkehren.

Ich habe diese Informationen aus einem Youtube- Video von Kholidfu erhalten, das zeigt, wie man Linien im normalen Modus mit einer Bewegung verbindet und teilt.

vdicarlo
quelle