Visualizzazione post con etichetta Sed. Mostra tutti i post
Visualizzazione post con etichetta Sed. Mostra tutti i post

mercoledì 28 ottobre 2015

Come tee nessuno!

Salve!

Oggi parliamo, ma solo per un esempio, del comando tee. Per approfondire vi invito ad andare sulla pagina di Wikipedia.

$ risultato=$(echo "Come tee nessuno"| tee  >(sed 's/ /_/g') >(sed  's/\(.*\)/\U\1/') >(rev))

$ echo "$risultato"

In questo caso l'output del comando "echo" viene passato contemporeaneamente, grazie a tee, a tre comandi diversi, che lo elaborano e ne restituiscono i rispettivi risultati:
1. Il primo sed aggiunge l'underscore.
2. Il secondo sed converte la frase da minuscolo in maiuscolo.
3. Il comando rev inverte i caratteri della frase.


Alla prossima.

venerdì 23 ottobre 2015

Ricerca case-insensitive e sostituzione con sed.

Salve!

Supponiamo di avere i seguenti dati contenuti nel file prova

luigi Marco luCa
Nino lucA MassImo
Vincenzo Andrea LuCA
Nino LUca Ivo Neo
Luigi LUCA Ivo Rob


Come potete notare il nome Luca è stato scritto in modo non corretto.

Il nostro intento è quello di fare una ricerca case-insensitive e correggere il nome in questione.

Perchè si possa avere la ricerca case-insensitive e la sostituzione in modo globale, si scrive così: 

$ sed 's/luca/Luca/Ig' prova

In altri termini, diciamo a sed di sostituire le stringhe luCA, LuCA, LUCa e LUCA con la stringa Luca.


Alla prossima!


domenica 4 ottobre 2015

Leggi fin dove ti dico io [sed, awk]

Immaginiamo di avere un testo e, individuata una parola, vogliamo che sed o awk legga (e ci restituisca in output) fino a quella parola, compresa o esclusa. O meglio, fino a quella riga in cui è compresa quella parola (sarebbe meglio dire stringa, eh).

Testo di esempio. [Poesia.txt]

La donzelletta vien dalla campagna,
In sul calar del sole,
Col suo fascio dell’erba; e reca in mano
Un mazzolin di rose e di viole,
Onde, siccome suole,
Ornare ella si appresta
Dimani, al dì di festa, il petto e il crine.
Siede con le vicine
Su la scala a filar la vecchierella
Incontro là dove si perde il giorno;
E novellando vien del suo buon tempo,
Quando ai dì della festa ella si ornava,
Ed ancor sana e snella
Solea danzar la sera intra di quei
Ch’ebbe compagni dell’età più bella.


Primo esempio.

Voglio che awk legga fino alla stringa "crine"

$ awk '{print} /crine/ {exit}' Poesia.txt


 Per ottenere lo stesso risultato con sed, avremmo dovuto scrivere:

$ sed '/crine/q' Poesia.txt


Secondo esempio.

Voglio che awk legga fino alla stringa "crine", escludendo, però, la riga che la contiene.

$ awk '/crine/ {exit} {print}' Poesia.txt


 Per ottenere lo stesso risultato con sed, avremmo dovuto scrivere:

 $ sed '/crine/Q' Poesia.txt

Alla prossima! 


venerdì 18 luglio 2014

Underscore [Brevi Esercizi]

Salve.

L'esercizio di oggi consiste nell'aggiungere l'underscore, "_", ai titoli di alcune canzoni riportati in un file di testo. 


Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

var = open("brani_1.txt","w")
for line in open('brani.txt'):
    var.write(line.replace(' ','_'))
var.close()


Awk

cat brani.txt | awk '{ gsub(" ","_"); print; }' > brani_1.txt

Sed

cat brani.txt | sed 's/ /_/g' > brani_1.txt

Tr

cat brani.txt |  tr ' ' '_' > brani_1.txt

Bash

var=$(cat brani.txt); echo "${var// /_}" > brani_1.txt

Alla prossima!

L'indice della rubrica "Brevi Esercizi" lo trovate qui.

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!

lunedì 23 giugno 2014

Cose di Sed

Dopo una giornata trascorsa al mare, sono stato colto da un dubbio esistenziale. Cosa che, forse, neanche Juhan.... No, no, lui lo saprà di sicuro!!

In questi giorni sto lavorando ad uno script in bash, presto vi dirò ogni cosa, ma oggi no. Oggi solo il dubbio esistenziale, poi fugato.

Ha a che fare con sed. Una cosa alla volta, però.

$ testo="ciao salve ciao ciao salve ciao ciao salve"

Ecco. Una variabile. Solo per velocizzare le cose. Avrei potuto usare anche un file di testo.

Se a sed chiedo di sostituire ciao con CIAO, mi cambia tutti i "ciao" della frase. Ecco il dubbio, io voglio che sostituisca solo il terzo ciao. Capite?

Perchè cambi solo il primo ciao, è facile. Basta omettere la /g, che sta per global replacement.

$ echo $testo | sed 's/ciao/CIAO/g'

CIAO salve CIAO CIAO salve CIAO CIAO salve

ma se tolgo la g...

$ echo $testo | sed 's/ciao/CIAO/'

CIAO salve ciao ciao salve ciao ciao salve

Vedete? Viene sostituita solo la prima occorrenza, ma non ci siamo ancora!

Eppure la soluzione era semplicissima, ma si sa, ciò che è semplice non è mai un prima, è sempre un dopo. In realtà bastava fare così:

$ echo $testo | sed 's/ciao/CIAO/3'

ciao salve ciao CIAO salve ciao ciao salve

Ora è semplice, infatti...

$ echo $testo | sed 's/ciao/CIAO/4'

ciao salve ciao ciao salve CIAO ciao salve

Ma non è finita! Potrei dire a Sed, ad esempio, di sostituire le occorrenze da un certo punto in poi...

$ echo $testo | sed 's/ciao/CIAO/3g'

ciao salve ciao CIAO salve CIAO CIAO salve

Dalla terza occorrenza in poi, solo "CIAO".

Poi c'è pure chi fa così:

$ echo $testo | sed 's/ciao/CIAO/2' | sed 's/ciao/CIAO/3'

ciao salve CIAO ciao salve CIAO ciao salve


Vabbè, alla prossima. ;)

P.S. Non so come dirvelo, ma questa dovrebbe essere la prima lezione del corso di sed, ecco.


venerdì 11 gennaio 2013

Brevi Esercizi #12. Eliminare linee da un file con sed

Salve!

Ed eccoci a una nuovo puntata di "Brevi Esercizi".

Oggi vedremo come eliminare linee da un file di testo con sed.

Cose semplici semplici eh! :)

venerdì 16 marzo 2012

Eliminare le linee vuote con sed

Salve!

Può succedere nella vita di voler eliminare le linee bianche in un file di testo.

Posto che il file si trovi nella directory "Prova"

$ cd Prova

do il seguente comando:

$ sed -i '/^$/d' file.txt

Però può succedere pure di pentirsi dell'azione commessa. Magari non è questo il caso, ma non si sa mai.