Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    31

    Chiarimento su RE stile Unix

    Ciao,
    ho un file con all'interno le seguenti tre linee:

    0123456789
    dante12345
    12345dante

    ora eseguo:

    cat nome_file | grep -E [^0-9]

    il risultato è:
    dante12345
    12345dante

    Quello che non capisco è perche le due linee sopra non vengo eliminate. L'insieme dei caratteri 0-9, non dovrebbe essere preso in considerazione. Sicuramente mi sfugge qualcosa di concettuale ma non riesco a capire...

    grazie
    ciao

  2. #2
    Perchè il comportamento delle RE in unix di default è "greedy" (avido), cioè si estendono al massimo possibile finchè non interviene una clausola che le limita.
    Devi includere nella RE una regola che escluda i caratteri alfabetici.
    NeapoliX GNU/Linux
    "Alla maggior parte della gente piace leggere la propria scrittura e annusare l'odore dei propri peti." (Auden)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    31
    Grazie,
    ma non è tanto chiaro potresti farmi un esempio banale o spiegarmelo in parole più povere?

    grazie tante ancora.

  4. #4
    NeapoliX GNU/Linux
    "Alla maggior parte della gente piace leggere la propria scrittura e annusare l'odore dei propri peti." (Auden)

  5. #5
    Utente di HTML.it L'avatar di cacao74
    Registrato dal
    Jan 2005
    Messaggi
    2,570

    Re: Chiarimento su RE stile Unix

    L'espressione regolare "[^0-9]" descrive del testo che NON comprende i caratteri numerici.
    Pertanto i risultati che hai ottenuto (contengono il testo "dante") sono corretti.

    [EDIT]
    Per ottenere quanto supponevi, puoi fare il matching inverso usando l'opzione "-v"
    codice:
    cat nome_file | grep -v "[0-9]"
    [/EDIT]
    ciao
    slack? smack!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    31
    I risultati che ho ottenuto però, non contengono solo del testo ma, anche i caratteri numerici che non dovrebbero matchare con il pattern della regular expression. Credo la spiegazione giusta sia quella di PinguinoGoloso ma non riesco ancora a metterla a fuoco.

    ciao

  7. #7
    Utente di HTML.it L'avatar di cacao74
    Registrato dal
    Jan 2005
    Messaggi
    2,570
    Originariamente inviato da zenzero
    I risultati che ho ottenuto però, non contengono solo del testo ma, anche i caratteri numerici che non dovrebbero matchare con il pattern della regular expression. Credo la spiegazione giusta sia quella di PinguinoGoloso ma non riesco ancora a metterla a fuoco.

    ciao
    Allora... secondo me...
    la descrizione che ha indicato PinguinoGoloso non e' propriamente corretta.
    Le RE sono si avide (basta testare qualche RE con ".*" per rendersene conto. ma nel caso in oggetto,
    di avidita' ne ho vista ben poca.
    Nel linguaggio reg-exp, la scrittura "[^0-9]" indica un qualunque carattere NON numerico.
    Ricercare una riga di testo (grep) in un file, tale per cui la condizione di cui sopra sia soddisfatta, porta ad ottenere i risultati precedenti.
    codice:
    [cacao74@tweety ~]$ cat cacao.txt 
    0123456789
    dante12345
    12345dante
    
    [cacao74@tweety ~]$ cat cacao.txt | grep -E "[^0-9]"
    dante12345
    12345dante
    Altro esempio spero chiarificatore:
    codice:
    [cacao74@tweety ~]$ echo "12a34" | grep -E "[^0-9]"
    12a34
    [cacao74@tweety ~]$ echo "1234" | grep -E "[^0-9]"
    ...nessun risultato...
    [cacao74@tweety ~]$ echo $?
    1
    Volendo "esagerare" con la ricerca del testo che hai riportato: :-)
    codice:
    [cacao74@tweety ~]$ cat cacao.txt | grep -E "[^0-9]{1,5}"
    dante12345
    12345dante
    
    [cacao74@tweety ~]$ cat cacao.txt | grep -E "[^0-9]{6}"
    [cacao74@tweety ~]$ echo $?
    1
    
    [cacao74@tweety ~]$ cat cacao.txt | grep -E "^[0-9]*$"
    0123456789
    Se cio' non bastasse:
    codice:
    [cacao74@tweety ~]$ cat cacao.txt | grep -oE "[0-9]+"
    0123456789
    12345
    12345
    
    [cacao74@tweety ~]$ cat cacao.txt | grep -oE "[^0-9]+"
    dante
    dante


    Nel link che ti ha fornito PinguinoGoloso trovi sufficienti dettagli per schiarire eventuali dubbi.

    Dimenticavo... nella pagina di manuale di "grep" viene chiaramente specificato:
    A bracket expression is a list of characters enclosed by [ and ]. It
    matches any single character in that list; if the first character of
    the list is the caret ^ then it matches any character not in the list.
    ciao
    slack? smack!

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    31
    Ragazzi la soluzione è molto semplice, l'ho saputa parlando con un guru dell'informatica:
    nella negazione non esiste il concetto di range... quindi io ho detto fammi vedere tutte le linee che non comprendono i seguenti caratteri: "0" "-" "9"

    ciao a tutti e cmq grazie.

  9. #9

    Re: Re: Chiarimento su RE stile Unix

    non credo sia quella la soluzione, io sto con cacao74.
    altrimenti, con quella spiegazione, echo "1234" | grep -E "[^0-9]" dovrebbe restituire 1234 , cosa che non accade.

  10. #10
    Utente di HTML.it L'avatar di cacao74
    Registrato dal
    Jan 2005
    Messaggi
    2,570
    Originariamente inviato da zenzero
    ...la soluzione è molto semplice, l'ho saputa parlando con un guru dell'informatica...
    ...chissa' che discussioni escono fuori...
    slack? smack!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.