domenica 13 luglio 2014

Sub(), Gsub() e Gensub() [awk]

Salve. Oggi iniziamo con la rassegna delle funzioni predefinite di (G)awk

Cominciamo con le funzioni di sostituzione, cioè con sub(), gsub() e gensub(), che ci permettono di sostituire una stringa con un'altra all'interno di un testo.

La differenza tra sub() e Gsub() è che mentre sub() sostituisce solo la prima occorrenza, gsub() ha una portata globale.

Gensub() invece ci dà la possibilità di stabilire quale occorrenza sostituire.

Per una questione di comodità assegniamo il nostro testo ad una variabile.

testo="Linux è il bene. Linux è il bene. Linux è il bene."

Sub()

Nel nostro primo esempio chiediamo ad awk di sostituire solo prima occorrenza "Linux" con "GNU/Linux".

$ echo "$testo" | awk '{ sub("Linux","GNU/Linux"); print; }'

Output:

GNU/Linux è il bene. Linux è il bene. Linux è il bene.

Con sed invece si fa così:

$ echo "$testo" | sed 's/Linux/GNU\/Linux/'

Output:

GNU/Linux è il bene. Linux è il bene. Linux è il bene.

Gsub()
 
In questo esempio chiediamo ad awk di sostituire tutte le occorrenze Linux con GNU/Linux.

$ echo "$testo" |  awk '{ gsub("Linux","GNU/Linux"); print; }'

Output:

GNU/Linux è il bene. GNU/Linux è il bene. GNU/Linux è il bene.

Con sed si fa così:

$ echo "$testo" | sed 's/Linux/GNU\/Linux/g'

Outuput:

GNU/Linux è il bene. GNU/Linux è il bene. GNU/Linux è il bene.


Gensub()

Nell'esempio sotto chiediamo ad awk, attraverso la funzione gensub(), di sostituire solo l'occorrenza che decidiamo noi. Nell'esempio chiediamo di sostituire la terza occorrenza "Linux" con GNU/Linux

$ echo "$testo" | awk '{ $0=gensub("Linux","GNU/Linux", 3); print; }'

Outuput:

Linux è il bene. Linux è il bene. GNU/Linux è il bene.

Con sed si fa così:

$ echo "$testo" | sed 's/Linux/GNU\/Linux/3'

Output:

Linux è il bene; Linux è il bene; GNU/Linux è il bene.

E se volessimo sostituire tutte le occorrenze, diverse tra loro, presenti in una riga, con la stringa GNU/Linux?

Definiamo la nostra solita variabile, sempre per comodità di esposizione.

testo1="Windows, Mac, Solaris"

$ echo "$testo1" | awk '{ gsub(/Windows|Mac|Solaris/, "GNU/Linux"); print }'

Output:

GNU/Linux, GNU/Linux, GNU/Linux


Con sed invece si fa così:

$ echo "$testo1" | sed 's/Windows\|Mac\|Solaris/GNU\/Linux/g'

Output:

GNU/Linux, GNU/Linux, GNU/Linux

Indice del corso "Un po' di AWK", qui.

Alla prossima!

Nessun commento:

Posta un commento