Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Linux - RegEx in Bash
Forum - Linux - RegEx in Bash

Avatar
Andrey_ (Normal User)
Newbie


Messaggi: 2
Iscritto: 30/10/2011

Segnala al moderatore
Postato alle 22:12
Domenica, 30/10/2011
Salve a tutti.

Qualcuno sa spiegarmi perché
Codice sorgente - presumibilmente Plain Text

  1. expr match "Mono: Playback 64 [100%" '.*\([1]*[0-9]*[0-9]%\)'



mi restituisce '0%'?

Voglio ottenere '100%'. Qualche idea?

Grazie in anticipo a chiunque mi darà una mano.

Ultima modifica effettuata da Andrey_ il 30/10/2011 alle 22:12
PM
Avatar
Andrey_ (Normal User)
Newbie


Messaggi: 2
Iscritto: 30/10/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 0:29
Lunedì, 31/10/2011
Mi scuso, il problema riguarda essenzialmente il funzionamento di expr, e lo riscontro anche in espressioni semplici come:

Codice sorgente - presumibilmente Plain Text

  1. expr match "[100%]" ".*\([:digit:]*%\).*"


Probabilmente ora sarà più facile aiutarmi...

In sostanza expr ignora completamente [:digit:]* e mi restituisce soltanto %.

Oppure sono io scemo. :-|

Ultima modifica effettuata da Andrey_ il 31/10/2011 alle 0:30
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 11:23
Lunedì, 31/10/2011
Ha ragione "lui" in entrambi i casi :D
Infatti nel primo caso hai specificato "[1]*[0-9]*[0-9]%", il che significa "zero o più 1, seguiti da zero o più cifre, seguite da una cifra, e poi un segno %". "0%" soddisfa l'espressione regolare nel caso in cui non ci siano occorrenze dei primi due gruppi.
Analogamente nel secondo caso, in cui [:digit:] può apparire zero o più volte. Ti matcha l'espressione in cui appare zero volte.

E' tuttavia curioso poiché, in genere, gli interpreti di espressioni regolari prendono dove possibile il match più lungo. Infatti esistono i quantificatori lazy, il cui scopo è far prendere esplicitamente i match più corti.
Secondo me potresti modificare il comportamento di default passando dei parametri a expr. Perché non usi grep?

Innanzitutto grazie per la risposta! :) - Andrey_ - 31/10/11 15:16
Ma come mai non posso rispondere con un altro post? - Andrey_ - 31/10/11 15:17
Comunque, cercherò di scrivere tutto su una riga :/ Per risolvere ho usato echo "stringa [miovalore] stringa" | cut -d'[' -f 2 | cut -d']' -f 1, ma mi interessava comunque sapere come posso ottenere il match più lungo di un pattern in una stringa, utilizzando expr. - Andrey_ - 31/10/11 16:45
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Up
0
Down
V
Segnala al moderatore
Postato alle 17:47
Lunedì, 31/10/2011
Codice sorgente - presumibilmente Plain Text

  1. expr match "[100%]" ".*\[\([:digit:]*%\)\].*"



* indica 0 o piu' occorrenze degli elementi nel set digit. "%" e' un valido match perche' ha 0 occorrenze. Specificando nell'espressione che il tutto dev'essere incluso tra parentesi quadre forza l'espressione ad includere anche il numero.

Ho capito il tuo ragionamento, ma purtroppo non funziona... non restituisce alcun match. - Andrey_ - 31/10/11 19:53
E poi come mai se a '*' sostituisco '+' (una o più occorrenze) non mi restituisce nulla? Non dovrebbe darmi almeno una cifra? - Andrey_ - 31/10/11 19:56
Ahh, ma expr utilizza le espressioni regolari "basic" (obsolete). Guarda la pagina man re_format alla voce "basic" regular expression. Dovrai utilizzare una sintassi diversa. Altrimenti usa grep - pierotofy - 31/10/11 22:13
Ah ok. Ho provato echo [100%] | grep -o -e ".*\([:digit:]*%\).*" ma mi restituisce [100%] con tutte le parentesi... Ignora il '-o'... ma possibile che tutti questi tool GNU facciano sempre di testa loro? Comunque grazie per l'aiuto. - Andrey_ - 31/10/11 23:45
http://stackoverflow.com/questions/1546711/can-grep-show-only-words-that-match-search-pattern - pierotofy - 01/11/11 17:57
Ah scusami, stavo sbagliando perché inserivo ancora l'espressione nella forma voluta da expr. La forma corretta per grep è quella che io mi aspettavo sin dall'inizio, ovvero echo "[100%]" | grep -o -i "[0-9]\{1,3\}%". Tutto risolto grazie! ;) - Andrey_ - 01/11/11 18:03
Solo un'ultima cosa, siccome avevo dimenticato il mio vecchio login ho creato questo nuovo account che sto utilizzando ora. Ti chiedo gentilmente di eliminare questo se possibile, dato che ho appena ritrovato il vecchio e userò quello :) - Andrey_ - 01/11/11 18:05


Il mio blog: https://piero.dev
PM