Newsgroup: it.comp.os.linux.iniziare
Titolo: grep: regexp per ciò che finisce per ".c"

Stavo cercando il modo per listare una directory contenente i sorgenti
di un software, documentazione, headers ecc ecc. E allo stesso tempo
avrei voluto che nella visualizzazione venissero tolti i .h e i .c.
Ci saranno mille modi immagino.... va bè.
Ho iniziato a provare a cercare i failes che finiscono per .c pensando
di cavarmela con un indolore:
ls -1 |grep '$\.c'
Invece non mi ritorna nulla....eppure in quella dir per forza di cose
c'è pieno di files .c ovviamente.
Qual'è secondo voi il motivo?
Sarà una sciocchezza di certo...ma non riesco a vederla.
grazie in ogni caso.
____________________________________
Mail: johnnynews at vfemail dot net

 ls -1 |grep '$\.c'
Ehm... $ è fine riga, lo sai, vero? :)
Non ho provato, ma così dovrebbe andare:
ls -1 | grep '\.c$'
Ciao,
David
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 ls -1 |grep '$\.c'
Secondo me la via più semplice è fare un bel
ls *.c
Che poi potresti trattare a piacimento, ad esempio rimuovendo il punto e 
quello che viene dopo (mi viene in mente di usare perl per questo)
-- 
"Le opinioni dei fanatici prescindono dai fatti"
python -c "print 'bG9ybWF5bmFAZ21haWwuY29t'.decode('base64')"
Linux Registered User: 461615
http://lmainardi.blogspot.com

 Ehm... $ è fine riga, lo sai, vero? :)
Eh eh.  ;-)
una svista...ma la regexp l'avevo impostata giusta riporto più
fedelmente:
$ ls -1
[...]
queue.h
read_db.c
[...]
$ ls -1 | grep '\.c$'
$ _
misteri....
Avevo sotto mano un terminale su un sistema emulato con qemu e messo in
rete con l'host (il responso sopra siriferisce a comandi lanciati
direttamente sull'host)....
ho provato dal sistema emulato a stabilire una sessione ssh verso l'host
e a dare lo stesso identico comando nella stessa dir anche se ero
loggato come root:
# ls -1 | grep '\.c$'
[...]
read_db.c
[...]
da qui funziona...
Invece direttamente sul sistema host anche loggato come root non
restituisce nulla. Mi sembra molto strano. Da cosa può dipendere?
Anche perchè collegandomi via ssh in pratica si lavora sull'host,
dovrebbe non cambiare nulla. Non saprei spiegarmelo...


 $ ls -1 | grep '\.c$'
Uhm... Perché quoti?
$ ls -1 | grep \.c$
$ ls -1 | grep -e \.c$
$ ls -1 | grep --regexp=\.c$
Sulla differenza di comportamente con ssh, non saprei.
-- 
Bye, Lem
Ceterum censeo ISLAM esse delendum
__________________________________
Combatti l'AIDS col tuo computer: 
http://fightaidsathome.scripps.edu/

 Uhm... Perché quoti?
Perché evidentemente eri sveglio, mentre io dormivo ancora.
Comunque quotando così a me funziona:
$ ls -1 | grep \\.c$
$ ls -1 | grep -e \\.c$
$ ls -1 | grep --regexp=\\.c$


 Sulla differenza di comportamente con ssh, non saprei.
Secondo me potrebbe essere un buon punto di partenza per capire
dove diavolo sta il problema....il punto è che non capisco cosa possa
cambiare se non il terminale da cui si lavora...peraltro ho provato
anche ad impostare la variabile TERM in modo uguale alla sessione ssh
(che era vt100). Ma nono cambia nulla: là funziona e qua no.... >:-((


 $ ls -1 | grep --regexp=\\.c$
E perchè il doppio backslash? ha la stessa funzione del quote ' ' ?
Comunque ho capito...per puro caso ma ci siamo.
Il problema a quanto pare è un alias di ls. Anche da root ho all'incirca
lo stesso alias:
root@notebook:~# alias ls
alias ls='/bin/ls $LS_OPTIONS'
root@notebook:~# echo $LS_OPTIONS
-F -b -T 0 --color=auto
e anche da user (quello l'avevo impostato io).
$ alias ls
alias ls='ls --color'
Ecco la riprova:
$ /bin/ls --color -1 | grep '\.c$'
$ _
ovvero non funziona: a grep l'output colorato non piace...magari
qualcuno di voi sa il perchè...io no, ma non mi fa poi tanto "specie".
;-)
Invece così:
$ /bin/ls -1 | grep '.c$'
[...]
both_phrases.c
chkhistory.c
chkhistory_db.c
db.c
[...]
Insomma funziona.
------
Adesso si spiega il motivo del funzionamento dalla sessione di ssh.
Infatti quando faccio il login testuale non sono attivi gli alias finchè
non dò "source .bashrc"....non so perchè ma lo riscontro sempre
all'avvio della macchina (slackware) in "init 3" cioè testuale (per
avviare X devo dare startx insomma.
Sulla macchina virtuale è accaduta la stessa cosa: facendo il login sul
sistema host quest'ultimo mi ha fatto entrare ma diverse variabili (tra
cui anche TERM e presumo anche $LS_OPTION, visto che anche loggato come
root funzionava) non sono state impostate, tant'è che gli alias non
funzionavano....riproverò per sicurezza ma il problema dovrebbe essere
tutto lì:
ls --color non sputa un output liscio ma comprensivo di qualcosa in più
oltre il testo e dandolo subito a grep non gli piace...
Altra riprova è la seguente:
$ /bin/ls --color -1 > ~/pluto.txt
$ less ~/pluto.txt
"/home/userc/pluto.txt" may be a binary file.  See it anyway?
dò "y" e salta fuori:
[...]
ESC[00mCONTENTSESC[00m
ESC[00mMakefile.inESC[00m
ESC[00mREADMEESC[00m
[...]
Ecco perchè...grep non sbagliava...tutte le righe finiscono per "ESC[00m".
invece se provo a togliere --color:
$ /bin/ls -1 > ~/pluto.txt
$ less ~/pluto.txt
ecco che sta volta è testo semplice:
[...]
CONTENTS
Makefile.in
README
[...]
Insomma, una sciocchezza...ma neanche tanto.


 Comunque ho capito...per puro caso ma ci siamo.
Bravo!
Ah, il malefico alias! ;)


 Ci saranno mille modi immagino.... va bè.
con grep me la sono cavata così:
/bin/ls -1| grep -v '\.c$\|\.h$'
ovvero utilizzando l'opzione -v che intercetta l'opposto di ciò a
cui corrisponde la regexp, quindi problema praticamente
risolto....ma...
Mi chiedevo se, data una regexp esiste un carattere particolare
che possa modificarla in modo da farle corrispondere il suo
complemento.... :-9   cioè:
data una rgexp:  '\.c$\|\.h$'  "tutte le righe che finiscono per .c
o .h "
esiste un carattere che aggiunto in qualche modo alla stessa ne
cambia il significato in "Tutte le righe tranne quelle che
soddisfano la regexp stessa" del tipo non so...
'!(\.c$\|\.h$)'
qualcosa del genere ovviamente ho messo il ! a caso, non so che
significato abbia in una regexp...e le tonde pure...
Vista la versatilità delle regexp penso che ci sia qualcosa del
genere ma non riesco a trovare in rete questo particolare.
