2013-03-15 22 views
15

Ben awk gibi sub() ve gsub() ile metin/dizge ikame yapabilir biliyorum:Birisi neden awk'in sub()/gsub() 'un bunun gibi çalıştığını açıklayabilir mi?

kent$ echo "fffff"|awk '{gsub('f', "b")}1' 
: Ben bir yazım hatası hata yaptı

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

veya

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

bugün, olarak çizgiyi yazdım

ama awk o ama çıkışım hakkında şikayet etmedi Her zamanki gibi, beklenmedik çıktı, hata bulmak için bazen beni aldı. awk verdi bana çıkış oldu:

bfbfbfbfbfb 

başka bir örnek:

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

birisi bana açıklayabilir misiniz garip ikame nasıl yapıldığını: sub() ile

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

örnek garip çok nedir? Joni gelen cevap

kent$ awk --version 
GNU Awk 4.0.2 

DÜZENLEME

teşekkürler. belki bu örnek daha iyi açıklıyor, onu burada ekleyin:

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 

cevap

19

Eğer {gsub(f, "b")}1 olduğunu gördüğü awk

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

yazarken. f değişkenini boş bir değere dönüştürür ve her boş dizgiyi yerine girişle birlikte b.

Boş karakter dizesi her karakter arasında ve sonuncusundan sonra bulunur, böylece awk, her f'dan sonra bir b ekler.

Kullanılmayan bir değişkeni olmadan, aynı etki için // veya "" yerine kullanabilirsiniz:

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

+1, makul geliyor. – Kent

+0

Bunun biraz riskli olsa bile, kullanılmasının bir hilesi olabileceğini düşünüyorum. :) – Kent

İlgili konular