2013-03-15 15 views
15

So awk può fare la sostituzione di testo/stringa con sub() e gsub() come:Qualcuno può spiegarmi perché awk's sub()/gsub() funziona in questo modo?

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

o

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

Comunque oggi ho fatto un errore errore di battitura, ho scritto la linea come:

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

Ma awk non si lamentava di ciò ma generava output come al solito, ovviamente, uscita inaspettata, mi ci è voluto un po 'di tempo per scoprire l'errore. L'uscita awk mi ha dato è stata:

bfbfbfbfbfb 

un altro esempio:

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

esempio con sub() è strano troppo:

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

Qualcuno mi potrebbe spiegare come è stato fatto la strana sostituzione?

kent$ awk --version 
GNU Awk 4.0.2 

EDIT

grazie per la risposta da Joni. forse questo esempio lo spiega meglio, ho appena aggiungo qui:

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 

risposta

19

Quando si scrive

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

cosa awk vede è {gsub(f, "b")}1. Interpreta f come variabile, con un valore vuoto, e sostituisce ogni stringa vuota nell'input con b.

La stringa vuota si trova tra ciascun carattere e dopo l'ultimo, quindi awk inserisce b dopo ogni f.

È possibile sostituire o //"" per lo stesso effetto, senza una variabile non utilizzata:

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

+1, sembra ragionevole. – Kent

+0

Sto pensando che questo potrebbe essere un trucco da usare, anche se è un po 'rischioso. :) – Kent

Problemi correlati