use strict; use warnings; use feature qw(say); my %exclude; @exclude{qw(UTUER UEB UE1 UE2 UE3 UE10 UE11 UE12 UEL THUE)} = (); while (my $line = ) { chomp $line; my @words = split / /, $line; for (@words) { next if exists $exclude{uc $_}; s/ae([^u])/ä$1/g; s/A[eE]([^uU])/Ä$1/g; s/([^ae])ue/$1ü/g; s/([^ae])U[eE]/$1Ü/g; s/oe/ö/g; s/O[eE]/Ö/g; } say join " ", @words; } __DATA__ Zunaechst mal noch etwas Input: Bei den Texten handelt es sich um Programmbeschreibungen, die einerseits normalen Text enthalten und anderseits kryptisch anmutende Fachkuerzel beinhalten. Diese Fachkuerzel sollen unveraendert erhalten bleiben. Im uebrigen habe ich heute festgestellt, dass sich die Liste der Fachkuerzel vermutlich um ein Vielfaches erweitern wird. Die Liste muss alle Fachkuerzel enthalten, die ae, oe oder ue enthalten. UTUER UEB UE1 UE2 UE3 UE10 UE11 UE12 UEL THUE Ich gehe mal davon aus, dass die Fachkuerzel eigenstaendige Woerter sind, also keine Wortteile eines groesseren Wortes. Das muss ich aber noch verifizieren. Prinzipiell ist richtig, dass ss noch ggf. in ss konvertiert werden muss. Aber das moechte ich mir dann als Kuer aufbewahren. Wenn man die Fachkuerzel zunaechst ausser Acht laesst, koennen folgende Such- bzw. Ersetzen-RegEx unter Beruecksichtigung der Gross- und Kleinschreibung verwendet werden: