Mehrere Zeilen zu einer Zeile zusammenfassen

8

Ich habe diesen Anwendungsfall einer XML-Datei mit Eingabe wie

%Vor%

Ich habe ungefähr 200K Zeilen in einer Datei im Eingabeformat, wie kann ich das schnell in Ausgabeformat umwandeln.

    
kal 18.03.2010, 04:36
quelle

11 Antworten

3

In vim könntest du das mit

machen %Vor%

Normalerweise: join fügt vor dem Verbinden am Ende jeder Zeile ein Leerzeichen ein, aber das ! unterdrückt das.

Im Allgemeinen würde ich empfehlen, eine geeignete XML-Parsing-Bibliothek in einer Sprache wie Python, Ruby oder Perl zu verwenden, um XML-Dateien zu manipulieren (ich empfehle Python + ElementTree), aber in diesem Fall ist es einfach genug, eine Regex zu verwenden Lösung.

    
Dave Kirby 18.03.2010, 07:32
quelle
4

In Vim:

  • Position in der ersten Zeile
  • qq : Aufnahme Makro starten
  • gJgJ : verbindet die nächsten beiden Zeilen ohne Leerzeichen
  • hinzuzufügen
  • j : gehe nach unten
  • q : Aufzeichnung stoppen
  • N@q : N = Anzahl der Zeilen (tatsächlich etwa 1/3 aller Zeilen, wenn sie unterwegs kondensiert werden)
Matteo Riva 20.03.2010 23:32
quelle
1
%Vor%     
ghostdog74 18.03.2010 04:50
quelle
1

Bash:

%Vor%     
pazhitnov 18.03.2010 13:19
quelle
1

Sie können ein Makro aufzeichnen. Grundsätzlich würde ich mit meinem Cursor am Anfang der ersten Zeile beginnen. Drücken Sie 'qa' (Makros werden in ein Register aufgenommen). Drücken Sie shift-V, um zeilenweise visueller Modus zu sein. Suchen Sie dann nach dem End-Tag '// abc'. Drücken Sie dann Shift-J, um die Linien zu verbinden. Dann müssten Sie den Cursor zum nächsten Tag bewegen, wahrscheinlich mit 'j ^' und drücken Sie 'q', um die Aufnahme zu stoppen. Sie können die Aufzeichnung dann mit '@a' erneut ausführen oder 10000 @ a angeben, wenn Sie möchten. Wenn die Tags unterschiedlich oder nicht direkt hintereinander sind, müssen Sie nur ändern, wie Sie die öffnenden und schließenden Tags für Suchen oder ähnliches finden.

    
Neg_EV 18.03.2010 15:21
quelle
1
%Vor%     
SergioAraujo 28.03.2010 16:38
quelle
0

uneleganter Perl-One-Liner, der den Trick, wenn auch nicht besonders schnell tun sollte.

%Vor%     
zellio 18.03.2010 04:41
quelle
0

Sie können dies tun:

%Vor%     
codaddict 18.03.2010 04:43
quelle
0
%Vor%     
ghostdog74 18.03.2010 05:10
quelle
0
%Vor%     
ghostdog74 18.03.2010 05:33
quelle
0

Dies sollte im Ex-Modus funktionieren:

:%s/\(^<abc.*>\)^M^\(.*\)^M^\(^<\/abc>\).*^M/^M/g

Ich sollte zusätzliche Leerzeichen (oder einen Tabulator zwischen den Werten) haben, aber Sie könnten es entfernen, je nachdem, was es ist (\ t oder \ \ \ \).

Was Sie suchen / ersetzen, ist hier (pattern1) [enter] (pattern2) [enter] (pattern3) [enter] und ersetzen Sie ihn durch (pattern1) (pattern2) (pattern3) [enter]

Das ^ M ist mit Strg + v STRG + m

erledigt     
user301075 24.03.2010 18:08
quelle

Tags und Links