Thread Zeile und Zeichen davor löschen (5 answers)
Opened by Tobias at 2012-10-02 09:05

topeg
 2012-10-02 09:45
#162301 #162301
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Du hast zwei Möglichkeiten.

1. Merke dir die letzte zeile und mache die Ausgabe um diese verzögert, dann hast du immer zwei Zeilen im Speicher, die du untersuchen kannst:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/perl
# Perl hat Hilfen die das Programmieren vereinfachen.
# diese beiden Zeilen laden Pragmas (Spezielle Module)
# die umfangreichere Fehlermeldungen machen.
# Perl ist damit nicht mehr so tolerant
# gerade wenn man anfängt kann perl mit seinen 
# Variationsmöglichkeiten eher stören als helfen.
use strict;
use warnings;

# es ist immer sinnvoll Fehlermeldungen zu machen
die("Bitte Dateinamen angeben!\n") if(!@ARGV)

# Den übergeben Dateinamen holen
my $file=$ARGV[0];

# Datei öffnen und fehlermeldung wenn es nicht geklappt hat
# $! enthält die Meldung von Perl oder dem System
open(my $fh, '<', $ARGV[0]) or die("Can't open $file ($!)\n")

#foreach (<>) {
# for ist hier schlecht,
# denn es ließt gleich die gesamte Datei ein
# und geht sie dann zeilenweise durch.
# bei while wird immer nur eine Zeile gelesen, das spart RAM


# die alte Zeile:
my $old_line='';

# datei Zeilenweise einlesen
while(my $new_line=<$fh>)
{
  if($new_line=/<Suchstring>/)
  {
    # letztes Zeichen löschen
    $old_line=~s/.\n$/\n/;
    # ganze Zeile löschen
    $new_line='';
  }
  print $old_line;
  $old_line=$new_line;
}
close($fh);

# noch die letzte Zeile ausgeben
print $old_line;


2. Lese die gesamte Datei ein und ersetze alle in dieser (nur sinnvoll wenn man genügend Speicher hat):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl
# Perl hat Hilfen die das Programmieren vereinfachen.
# diese beiden Zeilen laden Pragmas (Spezielle Module)
# die umfangreichere Fehlermeldungen machen.
# Perl ist damit nicht mehr so tolerant
# gerade wenn man anfängt kann perl mit seinen 
# Variationsmöglichkeiten eher stören als helfen.
use strict;
use warnings;

# es ist immer sinnvoll Fehlermeldungen zu machen
die("Bitte Dateinamen angeben!\n") if(!@ARGV)

# Den übergeben Dateinamen holen
my $file=$ARGV[0];

# Datei öffnen und fehlermeldung wenn es nicht geklappt hat
# $! enthält die Meldung von Perl oder dem System
open(my $fh, '<', $ARGV[0]) or die("Can't open $file ($!)\n")
# die ganze Datei lesen. Kein Zeilentrenner.
$/=undef;
# alles in "$data" einlesen
my $data=<$fh>;
# Datei schließen
close($fh);

# alles "ENGINE=MyISAM" suchen
# und durch "ENGINE=InnoDB" ersetzen
$data=~s/ENGINE=MyISAM/ENGINE=InnoDB/gs;

# alles <irgend ein zeichen>"\n"<irgendwas><SUCHSTRING><irgendwas>"\n" suchen
# und durch "\n" ersetzen
$data=~s/.\n.*?<SUSCHSTRING>.*?\n/\n/gs;

print $data;

Last edited: 2012-10-02 09:49:29 +0200 (CEST)

View full thread Zeile und Zeichen davor löschen