linux-l: Regular Expressions

Jens Dreger jens.dreger at physik.fu-berlin.de
Do Okt 26 13:06:34 CEST 2000


On Thu, Oct 26, 2000 at 12:50:39PM +0200, Joerg Haertwig wrote:
> Michael Weber wrote:
> > 
> > Moin,
> > 
> > heute nacht haben sich 2 Autoresponder froehlich
> > unterhalten. Ergebnis : 33.897 Mails, das ganze
> > auf 4 Accounts.
> > 
> > Dazwischen ungefaehr 200 Usermails, die unbedingt
> > gerettet werden sollen. Sehe ich ja auch ein. Nu
> > schwoere ich ja auf vi aber das scheint ihn zu
> > ueberfordern ( oder ich bin zu doof, was vermutlich
> > eher der Fall ist ), wie bekomme ich die Autorespondermails
> > aus den Dateien ? Einzige Gemeinsamkeit ist das
> > sie mit "From" anfangen und mit "-Team" aufhoeren.
> > 
> > Meine Versuche das mit Suchen und Ersetzen ueber
> > Regular Expressions hinzubekommen, scheitern
> > allerdings klaeglich. Vermutlich liegts daran, das
> > dazwischen mehrere Zeilen stehen oder an den Zeilen-
> > umbruechen dazwischen.
> > 
> > Meine bewaehrte Kombination mit find,chop und print
> > funkt auch nicht. Kann mir bitte einer auf die Spruenge
> > helfen ?
> > 
> > Michael
> 
> 
> mit perl ist es einfach
> 
> 
> zb.
> 
> ...
> 
> open(FILE, "<dein/file") || die "nich da";
> open(OFILE, ">/dein/neues/file") || dir "kann nich schreiben";
> 
> my $schalter = 0;
> while(<FILE>) {
> 
> 	$schalter = grep("^From",  $_);
> 	$schalter = grep("^-Team", $_);
> 
> 	print OFILE, $_ if ! $schalter;
> 
> }
> close(FILE);
> close(OFILE);
> 
> ...
> 
> 
> ohne gewaehr.

Vorsicht: "^From" matched auch "From:".
Ausserdem hatte ich das so verstanden, dass "-Team" ganz am Ende
steht. Ich habe meine Version gerade mal mit einem alten linux-l 
20MB folder gestestet, und siehe da: es hat zwei mails das Leben
gekostet, und zwar endeten die auf:

	  Ihr SuSE Support-Team

------8<-------------
#!/usr/bin/perl -w

@mail=();

open( OUT, ">newfolder" ) || die "wtf?";

while(<>) {
  print '.';
  if(/^From /) { print $m++,"\n"; print OUT @mail; @mail=(); }
  push @mail;
  if(/-Team$/) { print "killed\n"; @mail=(); }
}

print $m++,"\n"; 
print OUT @mail;
close( OUT );
--------8<---------------

Aufruf "scriptname.pl folder".

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l