Woher soll der neue String nach dem Ausführen von „sub“ in awk

aus der Awk-Programmiersprache

Die Funktion sub ( r, s , t ) findet zuerst die längste Teilzeichenfolge ganz links, die mit dem regulären Ausdruck r in der Zielzeichenfolge t; Anschließend wird die Teilzeichenfolge durch die Ersetzungszeichenfolge s ersetzt.

Die Funktion sub(r,s) ist ein Synonym für sub(r,s,$0).

In sub ( /ana/, "anda" , "banana" ) Beispiel: banana wird durch bandada 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 sucht sub() 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 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.