aus der Awk-Programmiersprache
Die Funktion
sub ( r, s , t )
findet zuerst die längste Teilzeichenfolge ganz links, die mit dem regulären Ausdruckr
in der Zielzeichenfolget
; Anschließend wird die Teilzeichenfolge durch die Ersetzungszeichenfolges
ersetzt.Die Funktion
sub(r,s)
ist ein Synonym fürsub(r,s,$0)
.In
sub ( /ana/, "anda" , "banana" )
Beispiel:banana
wird durchbandada
ersetzt.
Wie kann ich nach dem Ausführen von sub ( r, s , t )
die neue Zeichenfolge abrufen? Wie kann ich beispielsweise in sub ( /ana/, "anda" , "banana" )
die neue Zeichenfolge bandada
erhalten?
Die Unterfunktion gibt die Anzahl der vorgenommenen Ersetzungen zurück.
Ist die Rückgabe von sub
entweder 0 oder 1? Ist es richtig, dass es nicht mehr als eins sein kann, weil sub
nur die erste Übereinstimmung findet und ersetzt?
Danke.
Antwort
Aus dem GNU awk-Handbuch 9.1.3 Funktionen zur Manipulation von Zeichenfolgen :
… das dritte Argument für
sub()
muss eine Variable, ein Feld oder ein Array-Element sein Bei Versionen von awk kann das dritte Argument ein Ausdruck sein, der kein Wert ist. In einem solchen Fall suchtsub()
immer noch nach dem Muster und gibt null oder eins zurück, aber das Ergebnis von Substitution (falls vorhanden) wird weggeworfen, da es keinen Platz zum Platzieren gibt. Solche Versionen von awk akzeptieren Ausdrücke wie die folgenden:
sub(/USA/, "United States", "the USA and Canada")
Aus Gründen der historischen Kompatibilität akzeptiert gawk solchen fehlerhaften Code. Die Verwendung eines anderen nicht austauschbaren Objekts als dritter Parameter führt jedoch zu einem schwerwiegenden Fehler und Ihr Programm wird nicht ausgeführt.
Die Antwort lautet also, eine Variable zu verwenden:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana