Text-Dateien automatisch editieren

Hallo,

nachdem ich im Java-Forum keinen Erfolg hatte, poste ich hier nochmal!

Folgendes Problem: Ich will Textdateien im Stile von aa*.txt automatisch (also der Name soll schon im Quellcode vorhanden sein) öffnen, anschließend soll nach bestimmten Strings gesucht werden und bei Erfolg soll die komplette Zeile gelöscht werden.(Also nicht nur der Suchstring.) Ich brauch auch keine Oberfläche zur Eingabe dafür…das steht alles schon zur Laufzeit fest, also sollten die Suchstrings und Dateinamen schon im Quellcode stehen. Per RegEx ist das wohl gut machbar, hab aber weder von Perl noch von RegEx Ahnung…
Ich wäre auch für C++, Java-Code oder Skripte, die der Lösung dienen dankbar! Wäre toll wenn mir jemand auf die Sprünge helfen könnte!

Hallo,

in shell-Skript:

grep -v ‚regex‘ > aa*.txt.tmp
mv aa*.txt.tmp aa*.txt

wenn du kein Linux oder Unix hast geht das mit cygwin.

Mit Perl ist das auch kein Problem:

#!/usr/bin/perl

use strict;
use warnings;

my @files = qw(aa1.txt aa2.txt);
my $a;

foreach (@files) {
 open(IN, $\_);
 open(OUT, "\>", $\_.'.tmp');
 while($a = ){
 if ($a !~ /^123/){
 print OUT $a;
 }
 }
 close IN;
 close OUT;
 unlink $\_;
 rename $\_.'.tmp', $\_;
}

Viel Spaß damit,

Moritz

Hallo Moritz,
ich hab das cygwin installiert. Aber bei dem Shellscript scheint noch zu fehlen, was in der Textdatei zu löschen ist…konkretes Beispiel:

in der textdatei steht(ohne Anführungszeichen):
" xx: Mauer
xy: hilfe
xx: einreissen "

nach „xx:“ soll gesucht werden.
nachher soll nur noch dastehen:
" xy: hilfe "

Hallo Moritz,

Hi,

Aber bei dem Shellscript scheint noch zu fehlen, was in der
Textdatei zu löschen ist…

Noe, es fehlt die Datei.

in der textdatei steht(ohne Anführungszeichen):
" xx: Mauer
xy: hilfe
xx: einreissen "

nach „xx:“ soll gesucht werden.
nachher soll nur noch dastehen:
" xy: hilfe "

 $ grep -v 'xx' textdatei \>textdatei~ && mv textdatei~ textdatei

oder auch

 $ sed '/xx/d' textdatei \>textdatei~ && mv textdatei~ textdatei

Das ist allerdings langsamer und wenn man’s langsam will kann man natuerlich auch Perl nehmen. Oh, dazu bin ich wohl im falschen Brett.

HTH,
Gruss vom Frank.

perl -i.bak -ne 'print unless (m/xx/o)' \*.txt

Ich glaube nicht, dass das hier langsam ist (siehe anderes posting).

gruss
bernhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

perl -i.bak -ne ‚print unless (m/xx/o)‘ *.txt

Das ist vermutlich die einfachste Lösung mit perl. Mir war das -i nur bisher nicht bekannt…

Grüße,
Moritz

> perl -i.bak -ne 'print unless (m/xx/o)' \*.txt

Ich glaube nicht, dass das hier langsam ist (siehe anderes
posting).

Uh… also entweder ist mein perl kaputt oder…

frank@harbard [~] $ wc -l foo
3000000 foo
frank@harbard [~] $ time grep -v xx foo \>/dev/null

real 0m0.578s
user 0m0.542s
sys 0m0.029s
frank@harbard [~] $ time sed '/xx/d' foo \>/dev/null

real 0m3.071s
user 0m3.013s
sys 0m0.027s
frank@harbard [~] $ time perl -ne 'print unless (m/xx/o)' foo \>/dev/null

real 0m3.447s
user 0m3.363s
sys 0m0.032s
frank@harbard [~] $

Und guck Dir die viele Tipperei an, so lange Zeilen in eine Shell zu klimpern, und der Knoten, den ich vom Perlen aus meinem Gehirn kriegen muss und ueberhaupt… Nichts fuer ungut, Perl ist toll. Aber es ist _nicht_ schnell.

Gruss vom Frank.

frank@harbard [~] $ Und guck Dir die viele Tipperei an,
so lange Zeilen in eine Shell zu klimpern, und der Knoten, den
ich vom Perlen aus meinem Gehirn kriegen muss und
ueberhaupt… Nichts fuer ungut, Perl ist toll.
Aber es ist _nicht_ schnell.

Gruss vom Frank.

Hi Frank,

Hurra, ein Glaubenskrieg! So sieht es bei mir aus:

/u01/home/zyd3101/bbr \>wc -l foo
 3000000 foo
/u01/home/zyd3101/bbr \>time grep -v xx foo \>/dev/null

real 0m6.00s
user 0m5.61s
sys 0m0.38s
/u01/home/zyd3101/bbr \>time sed '/xx/d' foo \>/dev/null

real 0m11.15s
user 0m9.68s
sys 0m1.48s
/u01/home/zyd3101/bbr \>time perl -ne 'print unless (m/xx/o)' foo \>/dev/null

real 0m15.76s
user 0m15.16s
sys 0m0.53s

Ok, Perl ist nicht die schnellste Lösung (und die AIX-Büchse, auf der ich das getestet habe, ist auch eine Gurke :frowning: ). Aber, so groß ist der Hirnknoten auch wieder nicht…

Aber schau dir mal die ursprüngliche Frage im JAVA-Forum an: http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…

Wenn ich mir dann DEN zugehörigen Hirnknoten vorstelle (was für einen BufferReader muß ich denn jetzt wieder verwenden? Iteration über ein Dirctory-Object? etc. etc), ist die Kommandozeilenlösung - egal ob mit Perl, grep, sed, ed, vi … - immer noch die beste.

gruss
bernhard