Ich verwende eine E-Mail-Zitat-Attributionszeichenfolge wie diese:
On dd mmm yyyy hh:mm +hhmm, from [email protected] (Example Dot Org):
wobei [email protected]
die E-Mail-Adresse des Absenders und Example Dot Org
der richtige Name des Absenders ist.
Wenn kein richtiger Name angegeben wird (oder manchmal sogar, wenn einer angegeben wird), sind die beiden identisch und ich erhalte am Ende eine Zuordnungszeichenfolge wie diese:
On dd mmm yyyy hh:mm +hhmm, from [email protected] ([email protected]):
Wenn (und nur wenn) dies der Fall ist, möchte ich den Teil entfernen, sodass mir nur Folgendes bleibt:([email protected])
On dd mmm yyyy hh:mm +hhmm, from [email protected]:
Ich habe bereits ein Shell-Skript, das Perl aufruft, um die E-Mail zu bearbeiten, bevor sie an meinen Editor weitergeleitet wird, und ich denke, ich könnte einfach Code hinzufügen, um auch die Zuordnungszeile zu bearbeiten. Die Lösung könnte in Perl, awk, sed oder etwas anderem erfolgen (aber vorzugsweise nicht in etwaszuexotisch).
Ich weiß, dass die Zuordnungszeile die erste nicht leere Zeile nach der ersten leeren Zeile der Eingabe ist, und ich habe nichts dagegen, sie gegen mein bevorzugtes Zuordnungszeilenformat zu codieren. Das einfache Löschen des Teils in Klammern ist trivial, aberwie geht das nur, wenn es dem Vorhergehenden gleich ist?Am besten ohne das Risiko einzugehen, irgendetwas anderes in der E-Mail (Textdatei) zu verändern.
Antwort1
Ersetzen Sie einfach die Teilzeichenfolge, die die beiden Vorkommen der Adresse enthält, durch die erste Hälfte der Teilzeichenfolge, die nur eine Adresse enthält:
bash-4.2$ echo '
On dd mmm yyyy hh:mm +hhmm, from [email protected] (Example Dot Org):
On dd mmm yyyy hh:mm +hhmm, from [email protected] ([email protected]):
On dd mmm yyyy hh:mm +hhmm, from [email protected]:
' | sed -r 's/(, from (\S+)) \(\2\)/\1/'
On dd mmm yyyy hh:mm +hhmm, from [email protected] (Example Dot Org):
On dd mmm yyyy hh:mm +hhmm, from [email protected]:
On dd mmm yyyy hh:mm +hhmm, from [email protected]:
Antwort2
perl -lane 'print "($F[07]):" eq "$F[8]" ? "@F[0..7]:" : "@F"'
Dieser Perl-Einzeiler teilt den String an Leerzeichen auf, sodass der folgende String in 9 Teile aufgeteilt wird:
On dd mmm yyyy hh:mm +hhmm, from [email protected] ([email protected]):
Dabei wird Teil 8 (E-Mail-Adresse) mit Teil 9 (Name des Absenders) verglichen. Sind sie identisch, wird Teil 8 entfernt. Übrig bleibt:
On dd mmm yyyy hh:mm +hhmm, from [email protected]: