[RISOLTO] Problema regex

Bash, Perl, Python, Ruby, ...

[RISOLTO] Problema regex

Messaggioda mirko.pagliai » 16/09/2011, 18:20

Buona sera a tutti.

Questa è la variabile OUTPUT:
Codice: Seleziona tutto
]new file ----> dirprova2/nuovo file [BGN] Copying dirprova2/nuovo file from /home/mirko to //mirko-laptop//home/mirko/backup Shortcut: copying nuovo file from local file dirprova/gdsf [END] Copying dirprova2/nuovo file Synchronization complete at 18:18:13 (12 item transferred, 0 skipped, 0 failed)


A me interessa estrarre questo:
Codice: Seleziona tutto
12 item transferred

Dove quel "12" potrebbe essere un qualsiasi intero.

Ora, stranamente, nessuna delle due regex che qui riporto funziona:
Codice: Seleziona tutto
mirko@mirko-laptop:~/rsyncremote$ echo `expr match "$OUTPUT" '.*\([0-9]* item transferred\)'`
item transferred
mirko@mirko-laptop:~/rsyncremote$ echo `expr match "$OUTPUT" '.*\([0-9]+ item transferred\)'`


(la seconda, visibilmente, stampa una riga vuota)

Funziona invece così:
Codice: Seleziona tutto
mirko@mirko-laptop:~/rsyncremote$ echo `expr match "$OUTPUT" '.*\([0-9][0-9] item transferred\)'`
12 item transferred

Ovvero specificando il numero di occorrenze, cosa che però non posso fare.

Stranamente però, inserendo anche la parantesi tonda che precede subito quel numero, funziona:
Codice: Seleziona tutto
mirko@mirko-laptop:~/rsyncremote$ echo `expr match "$OUTPUT" '.*\(([0-9]* item transferred\)'`
(12 item transferred

Non riesco a venirne a capo.

Sto facendo riferimento a questi:
http://www.pluto.it/files/ildp/guide/ab ... ation.html
http://www.pluto.it/files/ildp/guide/ab ... l#REGEXREF
Ma non mi è chiaro, a proposito di questo passaggio (sottolineo):
Estrae $sottostringa dalla parte finale di $stringa, dove $sottostringa è un'espressione regolare.
[...]
Estrae $sottostringa dalla parte iniziale di $stringa, dove $sottostringa è un'espressione regolare.

Con "parte finale" e "parte iniziale" si intende "la prima occorrenza a partire dalla fine/dall'inizio"?

Un aiutino?



EDIT:
per ora ho risolto così:
Codice: Seleziona tutto
echo `expr match "$OUTPUT" '.*\(([0-9]* item[s]* transferred\)'` | sed -n "s/(//g;s/item[s]* transferred//g;/./p"

E va bene. Però vorrei proprio risolvere...
Ultima modifica di mirko.pagliai il 17/09/2011, 13:11, modificato 1 volta in totale.
Avatar utente
mirko.pagliai
Hero Member
Hero Member
 
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46

Re: Problema regex

Messaggioda sconosciuto » 17/09/2011, 13:06

Puoi provare ad usare grep:
Codice: Seleziona tutto
echo $OUTPUT | grep -Eo "[0-9]+ item(s)? transferred"
sconosciuto
Full Member
Full Member
 
Messaggi: 150
Iscritto il: 01/09/2008, 16:46

Re: Problema regex

Messaggioda mirko.pagliai » 17/09/2011, 13:11

Sì, perfetto. Così ottengo il numero:
Codice: Seleziona tutto
echo $OUTPUT | grep -Eo "[0-9]+ item(s)? transferred" | grep -Eo "[0-9]+"

Grazie, risolto.
Avatar utente
mirko.pagliai
Hero Member
Hero Member
 
Messaggi: 4102
Iscritto il: 15/03/2010, 23:46


Torna a Scripting

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite