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