Aus der Programmiersprache Awk
Die Funktion sub ( r, s , t )
findet zuerst den längsten
Teilstring ganz links, der mit dem regulären Ausdruck r
übereinstimmt im
Zielstring t
; es ersetzt dann den Teilstring durch den
Substitutionsstring s
.
Die Funktion sub(r,s)
ist ein Synonym für sub(r,s,$0)
.
In sub ( /ana/, "anda" , "banana" )
, zum Beispiel banana
wird
durch bandada
ersetzt .
Nach dem Ausführen von sub ( r, s , t )
, wie bekomme ich den neuen String?
Zum Beispiel in sub ( /ana/, "anda" , "banana" )
, wie bekomme ich den neuen String bandada
?
Die sub-Funktion gibt die Anzahl der vorgenommenen Ersetzungen zurück.
Ist die Rückgabe von sub
entweder 0 oder 1? Stimmt es, dass es nicht mehr als eins sein kann, weil sub
nur die erste Übereinstimmung finden und ersetzen?
Danke.
Akzeptierte Antwort:
Aus dem GNU awk-Handbuch 9.1.3 String-Manipulation Functions:
… das dritte Argument für sub()
muss eine Variable, ein Feld oder ein Array
-Element sein. Einige Versionen von awk lassen zu, dass das dritte Argument ein
-Ausdruck ist, der kein Lvalue ist. In einem solchen Fall sub()
sucht immer noch
nach dem Muster und gibt null oder eins zurück, aber das Ergebnis der
Ersetzung (falls vorhanden) wird verworfen, weil es keinen Platz gibt,
es abzulegen. 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 änderbaren Objekts als dritten Parameter führt jedoch zu einem schwerwiegenden Fehler
und Ihr Programm wird nicht ausgeführt.
Die Antwort ist also, eine Variable zu verwenden:
awk 'BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}'
bandana