Newsgroup: it.comp.os.linux.software
Titolo: una domanda banale...

Ho disogno di estrarre con uno script di shell l'ultima parola di una
stringa x qualsiasi, faccio un esempio: se il comando "cat pippo" mi
restituisce un record del tipo "questa è soltanto una frase di prova",
vorrei poter estrarre solo la parola "prova", assunto che non conosco a
priori ne la lunghezza del record ne il numero dei campi che lo
costituiscono. Ho provato in pipe con i comandi sed, awk, grep, ecc... Ma
per quanti tentativi abbia fatto,  non ho ancora trovato una soluzione.
Qualche buon idea ???
...ringrazio anticipatamente chiunque mi possa aiutare


non so bene che tipo di lavoro devi fare, ma credo che dovrai persevarare
con sed.
-- 
Ciao ....
      Massimiliano ADAMO
   E-Mail: 
maxa...@iol.it

 per quanti tentativi abbia fatto,  non ho ancora trovato una soluzione.
Non hai provato sufficientemente bene perche' con awk (hint NF) e
sed ce la puoi fare, basta impegnarsi un po' di piu' e leggere _bene_
le man pages.
-- 
Pierluigi De Rosa (
tho...@durin.khazad-dum.net
).
<<      LINUX: the choice of a GNU generation     >>
<<   For my real address... ask the Balrog.       >>
* Sostenete la Lega per la Soppressione dei Troll *

_bene_ le man pages.
non basta, per imparare le regexp ci va qualcosa in più (=farsi un culo 
così e usarle quotidianamente per lavoro e non avere scelta)
allora, l'estrazione dell'ultima parola di una stringa si fa con questa 
regexp:
\W(.*)$
(la parola viene catturata nelle parentesi tonde)
lo script sed è qualcosa del genere:
#!/usr/bin/sed
s/\W(.*)$/\1/g
oppure, se non funziona, questo:
#!/usr/bin/sed
s/\W\(.*\)$/\1/g
(dato che in certe implementazioni delle regexp le parentesi non sono 
considerate normalmente caratteri speciali)

s/\W(.*)$/\1/g
Sed NOn devi chiamarlo da uno script di bash. Cmq, a parte lo script,
cosi` non mi sembra, a occhiometro, che possano andare sai.
man sed
man re_syntax
-- 
Ci sentiamo  |  Remigio Zedda  || Attenzione! campo "From:" alterato
ciao Remigio |                 ||==> E-mail: 
remi...@tiscalinet.it
-------------|      ..si` d'accordo.. ma con la Deb e` un'altra cosa!
/* Linux 2.2.17 su Debian GNU/Linux 2.2 Potato */

 lo script sed è qualcosa del genere:
Non funzionano perche' mostrano l'intera riga. Probabilmente con awk
questo si fa molto piu' semplicemente, inutile accanirsi con sed.


 man re_syntax
Infatti non funzionano..
[thorin@durin thorin]$ grep serio testfile.txt | sed 's/\W\(.*\)$/\1/g'
Aggiungocome ultimo contributo (ed e' davvero l'ultimo poi sul serio


 cosi` non mi sembra, a occhiometro, che possano andare sai.
Il punto non e' questo, sed si puo' benissimo usare anche da uno script
bash (perche' no? di esempi ce ne sono a bizzeffe) ma che semplicemente
in quel modo non funziona.


in quel modo non funziona.
Io lo script di sed l'ho sempre fatto senza la riga: #!/bin/sed e l'ho
chiamato con: sed -f script file_oggetto e non con . script. Se dici
cosi` allora vuol dire che TIMTOWTDI :-)


Aggiungocome ultimo contributo (ed e' davvero l'ultimo poi sul serio
Ma si` che tanto gliele hanno postate su icold con Perl e Awk, che era
in crosspost, e vanno d'incanto.


 cosi` allora vuol dire che TIMTOWTDI :-)
No no, abbiamo ragione entrambi nel senso che nemmeno io metto
#!/bin/sed in uno script ma faccio uno shell script puro ed al massimo o
metto dei comandi sed in pipe :-)


questo si fa molto piu' semplicemente, inutile accanirsi con sed.
era solo sbagliata la regexp :)
e non mostra l'intera riga, mostra tutta la riga esclusa la prima 
parola, è quel "." la fregatura (e io ci casco puntualmente), va 
sostituito con "[^\W]" o "[\w]", e allora funziona. Questo perchè "." 
include proprio *qualsiasi* carattere, inclusi i separatori di parola

 Se dici cosi` allora vuol dire che TIMTOWTDI :-)
ma anch'io! solo che in questo caso un bello script faceva comodo, per 
essere riutilizzato

script, cosi` non mi sembra, a occhiometro, che possano andare sai
boh? e che ne so io?
comunque era un errore banale, non ci andava il "." ma qualcosa di più 
restrittivo:
s/\W([^\W]*)$/\1/g

questo si fa molto piu' semplicemente, inutile accanirsi con sed.
beh, semplicemente non l'ho provato. Sed mi manca

 include proprio *qualsiasi* carattere, inclusi i separatori di parola
Non vorrei insistere ma..
[thorin@durin thorin]$ grep ultimo testfile.txt | sed 's/\W([^\W]*)$/\1/g'
Aggiungo come ultimo contributo (ed e' davvero l'ultimo poi sul serio
se ho copiato bene l'ultima regexp che hai dato nemmeno stavolta pare
funzioni perche' comunque mostra l'intera riga.


 beh, semplicemente non l'ho provato. Sed mi manca
Appunto, io si e non funziona.


s/\W([^\W]*)$/\1/g
Ehm.. e` un po' complichescion.. l'ho postato piu` giu` a Thorin.


metto dei comandi sed in pipe :-)
Bene, forse questa benedetta ultima parola dell'ultima riga e proprio
un esempio in cui occorre uno script. Eccolo, testato:-))
=-=-=-=-=-=-=-=-=-=-=-=-
${
h
s/.* \([[:alnum:]_]*$\)/\1/
w pippo
}
=--=-=-=-=-=-=-=-=-=-=-=-=-
Infatti li`*li` non mi viene il modo di dare $ da riga di comando:-(
Inoltre sembra che \W non sia regolare per Sed.. forse proteggendolo
moolto e moolto bene con armi taglienti;-))


 l'importante e` capirsi:-)
Assolutamente no! Bash o altre shell non sano cosa sia #! .
*Tutti* i file con +x vengono dati in pasto a una delle exec(3) da
qualunque shell, e' _il kernel_ che controlla il formato dell'eseguibile,
in tutti gli unix.
In linux, do_load_script() in fs/binfmt_script.c:
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang))
	return -ENOEXEC;
-- 
Fabio Bonelli  fabio161616(at)
libero.it
 blackmagic(at)
penguinpowered.com
God is real, unless declared as an integer.

 un esempio in cui occorre uno script. Eccolo, testato:-))
BTW \W non esiste in sed, non l'ho visto nemmeno citato nel libro di
O'Reilly "Sed & awk" che mi pare una fonte piu' che autorevole..


	return -ENOEXEC;
Gia`, l'ho guardato adesso e non e` neppure tanto lungo, cmq c'e` da
studiarci un po'.. Ma dando source come ho detto prima, allora salto le
exec, no? Quindi dovrebbe essere da preferire perche' piu` veloce;-))


 exec, no? Quindi dovrebbe essere da preferire perche' piu` veloce;-))
Si, e ti risparmi un processo (se non lo metti in background). :-)
Il fatto e' che puoi farlo sono con gli script di _quella_ shell.
L'implementazione del #! e' per dare flessibilita' e trasparenza agli
script, che, in fondo, sono dei particolari eseguibili, dovresti far
passare, a mano, lo script nel giusto interprete, altrimenti.
[0] Veramente, bash sembra non farlo subito, fa un piccolo controllo sul
    file. Una roba tipo "se il file contiene caratteri ascii nei primi
    tot byte, (tranne #!) e' deciso, e' un mio script!". 
    Non mi va di andare a vedere i sorgenti di bash, probabilmente lo fa
    per risparmiarsi una delle exec, ma mi lascia perplesso.
[1] Anche perche' un file da eseguire non puo' essere. :-)
-- 
Fabio Bonelli  fabio161616(at)
libero.it
 blackmagic(at)
penguinpowered.com
To ensure privacy and data integrity this message has been encrypted
using dual rounds of ROT-13 encryption.

passare, a mano, lo script nel giusto interprete, altrimenti.
Gia`, e lo sapevo pure da altri post: e` per evitare che possa essere
eseguito da una shell non adatta ad una eventuale sintassi particolare.
THNX!!


 stringa x qualsiasi [...]
Ecco le mie soluzioni:
$ x="aaa bbb ccc"
Soluzione n. 1: cambio tutti gli spazi in '\n' e ritorno l'ultima riga,
contenente quindi l'ultima parola:
$ echo "$x" | tr ' ' '\n' | tail -1
ccc
Soluzione n. 2: uso le funzioni di pattern matching integrate in bash
(questa e' la mia soluzione preferita perche' non richiede programmi
esterni):
$ echo ${x##* }
ccc
Soluzione n. 3): uso sed (dopo qualche tentativo... ;-):
$ echo "$x" | sed 's/.* \([^ ]*\)$/\1/'
ccc
Da verificare bene le condizioni al contorno: una sola parola nella stringa,
nessuna parola nella stringa.
Ciao,
         Umberto

 Ecco le mie soluzioni:
Perche' vi ammazzate inutilmente? awk lo fa in modo banale.. e lo sto
dicendo dall'inizio del thread.
[thorin@durin thorin]$ grep ultimo testfile
Aggiungo come ultimo contributo (ed e' davvero l'ultimo poi sul serio
[thorin@durin thorin]$ grep ultimo testfile | awk '{print $NF}'
serio


 dicendo dall'inizio del thread.
Mmm... ci provo: perche` puo` essere che per un motivo o per un altro
qualcuno trovi scomodo awk? Inoltre e` sempre meglio vedere come si puo`
raggiungere lo stesso risultato passando per un'altra via (anche se
questa sara` piu` complicata) piuttosto che soffermarsi su una
Henryx
-- 
===UN*X is SEXY!===
who|grep -i "green eyes"|date; cd ~; apropos fsck; whatis `unzip`|touch; 
strip; finger; mount; gasp; yes|more; uptime; umount; sleep

 questa sara` piu` complicata) piuttosto che soffermarsi su una
sed non e' certamente la via migliore.. e' solo uno stream editor con
un set di comandi limitati per effettuare sostituzioni e trasformazioni
anche complesse ma ti limiti a fare cio' che potresti fare con Vi,
niente di piu'.


 niente di piu'.
Mica e` stato proposto solo sed come alternativa. 


 Mica e` stato proposto solo sed come alternativa. 
Veramente ho visto solo un altro esempio con tr, che e' comunque molto
piu' limitato rispetto a cio' che puo' fare awk. Consiglio di studiarlo
un po'.
