Verbinden Sie Linien zwischen einem bestimmten Textmuster in Vim

8

Ich habe eine Textdatei, die so aussieht:

A.
text
text
text


A.
more text

more text

A.
more text

Ich möchte alle Zeilen zwischen den "Markierungen" verbinden, A.damit es so aussieht:

A.texttexttext
A.more textmore text
A.more text

Wie kann ich das in Vim machen?

vim noob
quelle

Antworten:

4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Ersetzen Sie einen Mustervergleich:

  1. Neue Zeile,
  2. eine Gruppe mit

    1. dann nicht die Zeichenfolge, auf die A.direkt das Zeilenende folgt
    2. ein beliebiges Zeichen bis zum Zeilenende

mit:

  • alles stimmte überein, außer der Start-Newline (dh der obigen Gruppe),

und das global.

Daniel Andersson
quelle
1
Vielen Dank. Ich habe keine Ahnung, wie das Ding funktioniert, aber es scheint! Ich werde es sorgfältig sezieren müssen. Ich habe auch eine Lösung gefunden, indem ich alle Zeilen zusammengefügt und dann eine neue Zeile in "A" eingefügt habe.
Vim Noob
@vimnoob: :help \@!Weitere Informationen zu diesem Teil finden Sie in Vim. Ansonsten ist es hoffentlich einfach mit meiner Erklärung. Ein Problem bei Ihrem Ansatz besteht darin, dass " A." im Text, wenn auch nicht als isolierte Markierungslinie, so aufgeteilt wird, als wäre es ursprünglich eine Markierung. In der Praxis ist dies möglicherweise kein Problem (ich weiß nicht, wie Ihre "echte" Datei aussieht), aber im Allgemeinen kann es zu unerwünschtem Verhalten führen, wenn man sich dessen nicht bewusst ist.
Daniel Andersson
@vimnoob: Ich habe meine Antwort noch einmal gelesen und falls Sie mit der :%s///Syntax nicht vertraut sind : Es handelt sich um eine "Search and Replace" -Syntax in Vim. :Startet den Befehl, %gibt den gesamten Puffer als Bereich an und sstartet eine Ersetzung. /ist das Mustertrennzeichen (jedes andere Zeichen kann verwendet werden, ist aber /"Standard"). Das erste /startet das Suchmuster, das zweite das Ersetzungsmuster und das dritte beendet es. Nachfolgende Modifikatoren sind verfügbar, um die Groß- und Kleinschreibung nicht zu berücksichtigen usw. \1repräsentiert die erfasste Gruppe im Suchmuster. :%s/foo/bar/ersetzt foodurch barin der Datei.
Daniel Andersson
Vielen dank für Deine Hilfe. Ich muss nur dieses \ @ recherchieren! Teil, wie ich mit der grundlegenden Suche ersetzen und grundlegende Regexp vertraut bin.
Vim Noob
1
@Reman: Der einfachste Weg, an den ich sofort denke, ist ein nachfolgendes globales Muster-Match wie :%s/^A\.//. Die Methode in der Antwort erfasst nicht die ^A\.Muster selbst (sondern deren Abwesenheit), sodass diese Zeichenfolgen nicht auf offensichtliche Weise geändert werden können.
Daniel Andersson
7

Dies funktioniert auch (wenn die erste Zeile mit beginnt A.)

:v/^A/-1j!
Miro
quelle
Das funktioniert! Nett. +1
ZaSter
Ja, wahrlich, und zwei neue Tricks für mich nach dem globalen Anti-Pattern-Match (v): das 'j' für Join und das '!' für den Beitritt ohne Leerzeichen. Vielen Dank.
Fortboise
@Miro wow! Ich grüße Sie, Sir. Wenn du erklären könntest, warum es funktioniert, dann super! .. außerdem musste ich die Zeilen mit Tabulatorzeichen dazwischen verketten ... also habe ich vor dem Ausgeben als / $ / \ t / g Tabulatorzeichen am Ende jeder Zeile hinzugefügt über Befehl .. irgendein besserer Weg
ihightower