2013-03-15 10 views
15

Ich weiß awk mit sub() und gsub() wie Text/string Substitution tun:Kann mir jemand erklären, warum awks sub()/gsub() so funktioniert?

kent$ echo "fffff"|awk '{gsub("f", "b")}1' 
bbbbb 

oder

kent$ echo "fffff"|awk '{gsub(/f/, "b")}1' 
bbbbb 

aber heute habe ich einen Tippfehler Fehler gemacht, habe ich die Zeile wie:

kent$ echo "fffff"|awk '{gsub('f', "b")}1' 

Aber awk hat sich nicht darüber beschweren, sondern erzeugte Ausgabe Wie immer, natürlich, unerwartete Ausgabe, brauchte ich irgendwann, um den Fehler zu finden. Der Ausgang awk mir gab, war:

bfbfbfbfbfb 

ein weiteres Beispiel:

kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1' 
BfBaBfBaBfBaBfBaBfBXBXB 

Beispiel mit sub() ist seltsam zu:

kent$ echo "thanks in advance"|awk '{sub('a', "B")}1' 
Bthanks in advance 

Könnte mir jemand erklären, wie wurde die seltsame Substitution getan?

kent$ awk --version 
GNU Awk 4.0.2 

EDIT

danke für die Antwort von Joni. vielleicht dieses Beispiel erklärt es besser, ich habe es nur hier hinzufügen:

kent$ echo "thanks in advance"|awk '{f="k";sub('f', "B")}1' 
thanBs in advance 

kent$ echo "thanks in advance"|awk '{sub('th ank', "B")}1' 
awk: cmd. line:2: {sub(th 
awk: cmd. line:2:  ^unexpected newline or end of string 

Antwort

19

Wenn Sie

echo "fffff"|awk '{gsub('f', "b")}1' 

schreiben, was awk sieht, ist {gsub(f, "b")}1. Es interpretiert f als eine Variable mit einem leeren Wert und ersetzt jede leere Zeichenfolge in der Eingabe mit b.

Der leere String wird zwischen jedem Zeichen und nach dem letzten gefunden, also fügt awk nach jedem f einen b ein.

Sie können ohne eine nicht verwendete Variable // oder "" für den gleichen Effekt, ersetzen:

echo "fffff"|awk '{gsub(//, "b")}1'   # fbfbfbfbfb 
+0

+1, klingt vernünftig. – Kent

+0

Ich denke, das könnte ein Trick sein, auch wenn es ein bisschen riskant ist. :) – Kent

Verwandte Themen