Auf E-Mails antworten: Wie kann man mehrere "leere" (nicht wirklich leere; Zeilen, die nur aus "" Zeilen bestehen) zu einem zusammenfassen?

8

Ich versuche etwas zu tun wie dies aber für zitierte E-Mails, so das

%Vor%

Würde das werden

%Vor%

Danke

    
user3843237 16.07.2014, 02:59
quelle

4 Antworten

11

Unter der Annahme, dass jede visuelle Linie eine richtige logische Zeile ist (Zeichenkette endete mit \n ), können Sie auf die restlichen Werkzeuge verzichten und einfach uniq(1) auf der Eingabe ausführen.

Beispiel folgt.

%Vor%     
Noufal Ibrahim 16.07.2014 08:14
quelle
2
%Vor%

bedeutet:

/^>\s\s*$/d : Lösche alle Zeilen mit einem einzelnen > und Leerzeichen.

$b;/^[^>]/b : Drucken und überspringen Sie die letzte Zeile, eine Zeile, die nicht mit > beginnt.

a> : Fügen Sie > nach allen anderen Zeilen hinzu.

Gibt:

%Vor%     
perreal 16.07.2014 06:12
quelle
2

Versuchen Sie Folgendes:

%Vor%

Hier ist die Erklärung:

Verwendete Befehle:

  1. N Fügt die nächste Eingabezeile in den Musterbereich ein.
  2. D Bis zum ersten eingebetteten Newline im Musterbereich löschen. Starten Sie den nächsten Zyklus, aber überspringen Sie das Lesen von der Eingabe, wenn es noch ist Daten im Musterraum.

Verwendete Muster:

  1. /^>\s*$/ entspricht einer Zeile mit '& gt;' mit null oder mehr Leerzeichen gefolgt
  2. /^>\s*\n>\s*$/ stimmt mit zwei durchgehenden Zeilen überein und enthält > mit null oder mehr Leerzeichen bei der Verwendung zusammen mit N

Also ist der obige sed -Befehlsfluss:

  1. liest eine Zeile in den Musterbereich (wenn das Ende der Datei erreicht ist, exit)
  2. wenn der Musterbereich nur '& gt;' enthält gehe zu Schritt 4, sonst gehe zu Schritt 3
  3. Drucken Sie den Kontext im Musterbereich und gehen Sie zu Schritt 1
  4. append '\ n' und nächste Zeile zum Musterraum, wenn der Musterraum nur '& gt; \ n & gt;' enthält (was bedeutet, dass wir zwei fortlaufende '& gt;' Linien treffen), gehe zu Schritt 5, ansonsten gehe zu Schritt 3
  5. Löschen Sie den Kontext vor '\ n' (enthalten) und gehen Sie dann zu Schritt 2
WKPlus 16.07.2014 05:23
quelle
0

awk

Dies berücksichtigt die Leerzeichen im Gegensatz zu anderen Antworten (außer perreals :)) Es fügt auch nicht einfach eine > nach jeder Zeile mit mehr als > ein (das heißt, wenn mehrere Zeilen mit Text vorhanden wären, würden zwischen ihnen keine Leerzeilen eingefügt).

%Vor%

Erklärung

%Vor%

Wie diese Arbeit funktioniert, setzt man x auf & gt; wenn es eine Zeile findet, die nur & gt; und Räume.
Dann fährt fort, bis es eine Zeile findet, die nicht übereinstimmt, druckt & gt; und druckt die Linie. Dies wird jedes Mal zurückgesetzt, wenn das Muster erneut gefunden wird.

Hoffe das hilft:)

    
user3442743 16.07.2014 08:07
quelle

Tags und Links