[regularExpression] dubbio importante

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
toni00c
Prode Principiante
Messaggi: 207
Iscrizione: giovedì 19 maggio 2011, 9:13
Distribuzione: xubuntu,debian,tails,linux mint

[regularExpression] dubbio importante

Messaggio da toni00c »

ciao ho un grosso problema con le regular expression :muro: :muro: :muro:

dati i file nella dir :

Codice: Seleziona tutto

1.txt
a
a.*
appppppppppj.txt
arpiero.txt
a.txt
col.txt
cool.txt
coooooooool.txt
il ppppp ddsa  l.txt
kola.txt
p2
pall.txt
.....
il comando ls | grep a.*
non mi restituisce nulla , mentre io gli sto dicendo a seguito da qualsiasi carattere ripetuto 0 o più volte

mentre
ls | grep "a.*" restituisce 9 risultati

Codice: Seleziona tutto

a
a.*
appppppppppj.txt
arpiero.txt
a.txt
il ppppp ddsa  l.txt
kola.txt
pall.txt


e ls | egrep "a.{3}" restituisce 6 risultati

Codice: Seleziona tutto

appppppppppj.txt
arpiero.txt
a.txt
il ppppp ddsa  l.txt
kola.txt
pall.txt

per quale motivo sono costretto a mettere il double quoting con le regular expression? quando è obbligatorio usarlo?
perchè io impongo a grep 3 occorrenze del carattere che precede e lui mi trova ad esempio arpiero.txt che di occorrenze di r n ha solo una ?
quando scrivo una regular expression i metacaratteri della shell perdono il loro significato no? es * nella shell significa qualsiasi stringa, mentre nella regular expression
qualsiasi occorrenza del carattere che precede

grazie
.. ubuntu customization kit... la mia vera rivoluzione comincia ora.. :birra:
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [regularExpression] dubbio importante

Messaggio da UbuNuovo »

il comando ls | grep a.*
non mi restituisce nulla
È buona regola mettere quanto cercato tra apici o virgolette
mentre
ls | grep "a.*" restituisce 9 risultati
Scritta così vuol dire "a" seguita da "." qualsiasi carattere "*" zero o più volte
bisogna usare l'escape "/" per i carattereri speciali:

Codice: Seleziona tutto

ls | grep 'a\.\*'
a.*
ls | egrep "a.{3}" restituisce 6 risultati
egrep è deprecato, meglio scrivere

Codice: Seleziona tutto

ls | grep -E "a.{3}"
che vuol dire "a" seguita da tre caratteri qualsiasi; guarda la parte colorata dell'output.
Per definire il match preciso in output puoi usare le ancore (^ e $) poi c'è l'opzione "-o" per avere quello che appare colorato in output.
per quale motivo sono costretto a mettere il double quoting con le regular expression? quando è obbligatorio usarlo?
Puoi usare gli apici quando non vuoi che sia fatta l'espansione delle variabili e le virgolette se invece la vuoi.
perchè io impongo a grep 3 occorrenze del carattere che precede e lui mi trova ad esempio arpiero.txt che di occorrenze di r n ha solo una?
Imporre 3 volte il carattere 'a' si fa con l'espressione 'a{3}' non 'a.{3}'
quando scrivo una regular expression i metacaratteri della shell perdono il loro significato no? es * nella shell significa qualsiasi stringa, mentre nella regular expression
qualsiasi occorrenza del carattere che precede.
Già detto sopra, grep si aspetta una regex non il globbing, le varie espansioni della schell si "annullano" usando gli apici.

Correggetemi se ho detto qualche bischerata.
Salva l'Ucraina! 🇺🇦
Avatar utente
kimj
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1058
Iscrizione: sabato 13 settembre 2008, 11:45

Re: [regularExpression] dubbio importante

Messaggio da kimj »

toni00c [url=http://forum.ubuntu-it.org/viewtopic.php?p=4551002#p4551002][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:ciao ho un grosso problema con le regular expression :muro: :muro: :muro:

dati i file nella dir :

Codice: Seleziona tutto

1.txt
a
a.*
appppppppppj.txt
arpiero.txt
a.txt
col.txt
cool.txt
coooooooool.txt
il ppppp ddsa  l.txt
kola.txt
p2
pall.txt
.....
il comando ls | grep a.*
non mi restituisce nulla , mentre io gli sto dicendo a seguito da qualsiasi carattere ripetuto 0 o più volte

mentre
ls | grep "a.*" restituisce 9 risultati

Codice: Seleziona tutto

a
a.*
appppppppppj.txt
arpiero.txt
a.txt
il ppppp ddsa  l.txt
kola.txt
pall.txt


e ls | egrep "a.{3}" restituisce 6 risultati

Codice: Seleziona tutto

appppppppppj.txt
arpiero.txt
a.txt
il ppppp ddsa  l.txt
kola.txt
pall.txt

per quale motivo sono costretto a mettere il double quoting con le regular expression? quando è obbligatorio usarlo?
perchè io impongo a grep 3 occorrenze del carattere che precede e lui mi trova ad esempio arpiero.txt che di occorrenze di r n ha solo una ?
quando scrivo una regular expression i metacaratteri della shell perdono il loro significato no? es * nella shell significa qualsiasi stringa, mentre nella regular expression
qualsiasi occorrenza del carattere che precede

grazie
senza essere quotato, quel

Codice: Seleziona tutto

grep a.*
non viene interpretato da grep come una espressione regolare, ma l'a.* viene espanso dalla shell prima di essere passato come argomento a grep.
quindi, la shell espande quel a.* nella lista di file corrispondenti (utile se lo passi direttamente ad ls: prova 'ls a.*'), pertanto grep riceve come argomento da cercare 'a.txt' e fallisce. in realta', non dovrebbe non restituire output: dovrebbe restituire tutte le righe che contengono 'a.txt', quindi 'a.txt' e 'koalA.TXT'. Sicuro di averlo dato nella directory giusta?
edit: visto ora che avevi altri file ('a.*') che sarebbero stati espansi dalla shell come argomenti a grep

il punto '.' e' un metacarattere, ha un suo significato nella regex. se vuoi 'trovarlo', devi fare un escape:

ls | grep 'a\.'

trova tutte le righe contenenti il pattern 'a.'

{3} significa ripetuto tre volte.
'a\.{3}'
significherebbe: 'a...'

curiosita': il punto e' un wildcard per un qualsiasi carattere, ripetuto una sola volta.
grep -E 'a\..{3}' troverebbe a seguito da punto seguito da tre caratteri ignoti, quindi koala.txt ed a.txt (quello che forse cercavi di fare prima)

non ho ben capito che vuoi fare, ma se lo scopo e' fare match del file 'a.*', allora come ti e' stato detto:

ls | grep 'a\.\*'

Alternativamente, puoi dire a grep di interpretare l'argomento come una stringa fissa, non come una regex (cosa piu' sana, per esempio se stai sviluppando uno script):

Codice: Seleziona tutto

ls | grep -F "a.*" 
dovrebbe farti ottenere il risultato voluto
We no longer think of chairs as technology; we just think of them as chairs. But there was a time when we hadn't worked out how many legs chairs should have, how tall they should be, and they would often 'crash' when we tried to use them.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti