Schrift
[thread]7685[/thread]

Ersetzen von Benutzernamen

Leser: 1


<< >> 5 Einträge, 1 Seite
nikster77
 2006-02-08 01:01
#62743 #62743
User since
2006-02-08
26 Artikel
BenutzerIn
[default_avatar]
Hallo miteinander.
Ich habe folgendes Problem:

Ich moechte in einem Textfile bestimmte Namen ersetzen, also ueberall wo z.B. W.Maier, T.Mueller, etc. steht moechte ich den voll ausgeschriebenen Namen einsetzen.
Das sind einige Namen...

Ich habe mir also gedacht ich koennte die Namen in eine Hashtabelle speichern (aus einem anderen File relativ einfach mit sed generiert).

Hier nun mein Ansatz:

Code: (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
#!/usr/bin/perl -w

   # Dateiname ermitteln
   $dateiname = $ARGV[0];  # der Skriptname steht in $0
   @zeilen = ();

# Hashtabelle erstellen und umkehren
%my_addresses_hash = (
"armin.mueller" => "amueller",
"thorsten.mustermann" => "tmustermann",
"klaus.meier" => "kmeier",
);
%reverse_my_addresses_hash = reverse %my_addresses_hash;
@reverse_my_addresses_array = %reverse_my_addresses_hash;

#Die zu suchenden/ersetzenden Werte werden getrennt
@search = keys %reverse_my_addresses_hash;
@replace = values %reverse_my_addresses_hash;

   # Datei lesen
         open (DATA, "$dateiname") || die "konnte die Datei nicht oeffnen\n";
         #Solange noch etwas in der Datei steht, fuehre sed-Aktion aus
         while (<DATA>)
         {
         s/$search/$replace/g;
         ##Die geaenderten Dateien werden in einem neuen Array gespeichert.
         push (@content, $_);
         }
         #Die Datei wird nach der Bearbeitung geschlossen.
         close (DATA);
         #Die Datei wird zum schreiben geoeffnet
         open (WRITE, ">$dateiname") || die "konnte Datei nicht beschreiben\n";
         #Die Datei wird mit dem Inhalt des Arrays ueberschrieben.
         print WRITE @content;
         ##die fertige Datei wird geschlossen.
         close (WRITE);


Funktioniert leider nicht, ich bin aber auch nicht so fit in perl um zu sagen warum...
koennte mich jemand vielleicht direkt mit der Nase draufstossen?

Danke vielmals\n\n

<!--EDIT|esskar|1139361602-->
esskar
 2006-02-08 03:21
#62744 #62744
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
bitte erstmal
* use strict; und use warnings; verwenden
* code anpassen
* schön formatieren
* nochmal posten

:-)
renee
 2006-02-08 03:56
#62745 #62745
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
*) Benutze CPAN:Tie::File
*) Hash ist ne gute Lösung, aber Du solltest keys und values vertauschen

Steht pro Zeile ein Name?? Wenn ja, könnte das hier nützlich sein:
Code: (dl )
1
2
3
4
5
6
7
tie my @array,'Tie::File',$dateiname or die $!;
for(@array){
chomp;
s~$_~$hash{$_}~;
$_ .= "\n";
}
untie @array;


Wenn nicht, dann musst Du aus der Zeile erstmal die Vornamen parsen...\n\n

<!--EDIT|renee|1139363884-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2006-02-08 09:43
#62746 #62746
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Die Substitution müsste ungefähr so aussehen:
Code: (dl )
s/$search/$reverse_my_addresses_hash{$1}/e;
, wobei $search alle Suchbegriffe in einer Regexp kombiniert:
Code: (dl )
$search = "(" . join("|", map { quotemeta } @search) . ")"

Ungetestet.
nikster77
 2006-02-10 00:54
#62747 #62747
User since
2006-02-08
26 Artikel
BenutzerIn
[default_avatar]
Hallo und vielen Dank fuer eure Antworten. :)
Leider werde ich erst am WE dazu kommen das auszuprobieren.
Ich sag dann bescheid ob's geklappt hat.
<< >> 5 Einträge, 1 Seite



View all threads created 2006-02-08 01:01.