Hallo zusammen,
vielleicht kann mir einer der anwesenden awk-Spezialisten bei folgender Frage weiterhelfen. Gegeben sei folgende Regel, anwendbar auf beliebige Strings:
####### - Der Input bleibt unverändert, wenn er "null" ist oder nur aus Blanks besteht. - Ansonsten werden die letzten sechs Stellen durch einen zufälligen Text ersetzt. - Hierbei werden Großbuchstaben durch Großbuchstaben, Kleinbuchstaben durch Kleinbuchstaben und Ziffern durch Ziffern ersetzt. - Enthält der Text rechtsbündige Blanks, so bleiben diese erhalten und werden bei der Ersetzung ignoriert. - Blanks und Sonderzeichen bleiben unverändert. - Enthält der Text weniger als sechs Stellen, werden diese durch einen gleich langen zufälligen Text gemäß obigen Regeln ersetzt.
Beispiel: "WXG73H23wZ " --> "WXG75T95aC " #######
Alle relevanten Funktionen zum Ersetzen der jeweiligen Chars funktionieren bereits.
Momentan scheitere ich offenbar an der Regex, welche beim Aufruf von gensub() zwar den Inhalt der Backreference liefert, aber leider auch den kompletten String davor. Die RegEx selbst soll nur die 6 relevanten Zeichen ohne die folgenden Whitespaces extrahieren, damit diese durch die Ersetzen-Funktion weiterverarbeitet werden können.
Der folgende Aufruf liefert bei der Eingabe von "WXG73H23wZ " aber nicht wie erwartet ein "3H23wZ" sondern wieder "WXG73H23wZ "
############## sRegEx = "(.{1,6}[^\s])\s*$" print gensub(sRegEx,"\1","g",sInput) ##############
Selbst wenn ich den Quantifier ".{1,6}" durch ".?.?.?.?.?.?" ersetze, weil das nicht bei allen awk-Versionen umgesetzt ist, bleibt das Ergebnis das gleiche.
Wenn ich zum "debuggen" ein 'print gensub(sRegEx,"#\1","g",sInput)' nutze, wird stattdessen "WXG73H#23wZ " zurückgeliefert, d.h. \1 matcht offenbar - nur nicht das richtige.
Wo liegt mein Denkfehler?
Grüße /Marian