espressioni regolari... sostituzione di [^

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

espressioni regolari... sostituzione di [^

Messaggio da ZeroUno »

Ho preso a studiare le espressioni regolari.
ora mi trovo di fronte a questo problema:
pippo
pluto
paperino

espressione regolare voluta: "prendi tutto tranne pluto"
per un solo carattere è facile; su una lista
a
b
c
e non voglio 'b'
[^b]
va più che bene.

sulla prima lista, in teoria va bene
^[^p][^i][^p][^p][^o]$
(facciamo la supposizione che lavoriamo tutto in minuscolo)
però io non conosco a priori la parola da escludere dalla lista.
Ho quindi bisogno di qualcosa di simile alle [], ma che funzioni per argomenti un po' più complessi, quali potrebbe essere anche un'altra espressione regolare dentro un (); per l'OR (come [ax3e]) si sostituisce tranquillamente con (a|x|3|e), ma il [^ come lo sostituisco?

Ciao,
01
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
dapuzz
Linux 4.x
Linux 4.x
Messaggi: 1137
Iscritto il: mar 16 mag 2006, 11:09
Contatta:

Messaggio da dapuzz »

Non ci ho capito una cippa. Ma l'unica cosa che posso dire è che
^[^p][^i][^p][^p][^o]$ dovrebbe ad occhio e croce essere equivalente a ^[^pippo]$
Quindi se non vuoi nè pippo nè pluto dovrebbe andarci [^pippo|^pluto]. Ti sono stato utile? :D

Domanda, ma come? vuoi escludere una parola, ma non sai che parola? :D

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Messaggio da ZeroUno »

dapuzz ha scritto: ^[^p][^i][^p][^p][^o]$ dovrebbe ad occhio e croce essere equivalente a ^[^pippo]$
Quindi se non vuoi nè pippo nè pluto dovrebbe andarci [^pippo|^pluto]. Ti sono stato utile? :D
No.
^[^pippo]$ equivale a ^([^p]|[^i]|[^p]|[^p]|[^o])$ ovvero prenderebbe tutte le parole di un carattere che non siano p,i,o
l'altra prende tutte le parole che non contengono p,i,o,l,u,t,^,| (in cui ^ e | sono proprio i simboli relativi), mentre a me serve l'intera parlola.
Tra l'altro la mia è pure sbagliata:
che non comincia per 'p' (e quindi non becchiamo Pippo Pluto)
non continua per 'i' (e quindi non becchiamo Pippo Pluto mInni)
non continua per 'p' (e quindi non becchiamo Pippo Pluto mInni toPolino)
non continua per 'p' (e quindi non becchiamo Pippo Pluto mInni toPolino carPa)
non continua (e termina) per 'o' (e quindi non becchiamo Pippo Pluto mInni toPolino carPa carrO)
(il mio intento era bloccare solo pippo)
Domanda, ma come? vuoi escludere una parola, ma non sai che parola? :D
La parola potrebbe essere presa da una variabile o da una combinazione di altre parole o da un back reference

Ciao,
01
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
dapuzz
Linux 4.x
Linux 4.x
Messaggi: 1137
Iscritto il: mar 16 mag 2006, 11:09
Contatta:

Messaggio da dapuzz »

Creato file asd con questo contenuto

Codice: Seleziona tutto

dapuzz@slax:~$ cat asd
pippo
pluto
paperino
minni
dapuzz@slax:~$ grep [^pippo] asd
pluto
paperino
minni
dapuzz@slax:~$grep [^pippo\|^pluto] asd
paperino
minni
il \ è solo per escapare il pipe. comunque le espressioni regolari non sono mai state il mio forte! E ne sto dando ampia dimostrazione :asd:

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Messaggio da ZeroUno »

[quote="dapuzz"]

Codice: Seleziona tutto

dapuzz@slax:~$ cat asd
pippo
pluto
paperino
minni
dapuzz@slax:~$ grep [^pippo] asd
pluto
paperino
minni
Okkio, questa regexp ha funzionato per caso.
Aggiungi una voce "pio" (per esempio) alla lista e noterai che viene troncata anche quella.

Ciao,
01
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
dapuzz
Linux 4.x
Linux 4.x
Messaggi: 1137
Iscritto il: mar 16 mag 2006, 11:09
Contatta:

Messaggio da dapuzz »

vero, :( per fortuna il prof di lab non se n'è mai accorto :lol:

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

per prendere tutte le stringhe tranne una basta usare l'opzione -v di grep

ad esempio, se file.txt é costituito da

Codice: Seleziona tutto

pippo
pluto
paperino

Codice: Seleziona tutto

 cat file.txt | grep -v pippo
dá come risultato

Codice: Seleziona tutto

pluto
paperino

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Messaggio da ZeroUno »

Paoletta ha scritto:per prendere tutte le stringhe tranne una basta usare l'opzione -v di grep
Conosco grep a menadito, e ti so fare incastri a non finire tra grep sed egrep, -v -w -i -...
Ma ora io non posso passare nessuna opzione a grep & c., quindi devo lavorare esclusivamente sulla espressione regolare.

Matteo
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

ZeroUno ha scritto:
Paoletta ha scritto:per prendere tutte le stringhe tranne una basta usare l'opzione -v di grep
Conosco grep a menadito, e ti so fare incastri a non finire tra grep sed egrep, -v -w -i -...
Ma ora io non posso passare nessuna opzione a grep & c., quindi devo lavorare esclusivamente sulla espressione regolare.

Matteo
in tal caso non credo che si possa fare...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio da targzeta »

ZeroUno ha scritto:...io non posso passare nessuna opzione a grep & c., quindi devo lavorare esclusivamente sulla espressione regolare.
Non penso si possa trovare soluzione, anche io quando studiai le RE mi posi la stessa questione senza venirne mai a capo.
Fatto sta che poi alla fine non e' cosi' grave, basta capire cosa vuoi fare? Se vuoi fare uno script, non vedo perche' non usare 'grep -v'. Se vuoi scrivere un programma, non vedo la difficolta' nel farti una piccola funzioncina che faccia al caso tuo.

Spina

In effetti penso ci siano ragioni valide che spieghino il perche' non si possa trovare, in un testo, il complemento di una stringa data. La prima cosa che mi viene in mente e' che le RE sono usate per fare matching e non per fare 'non matching'.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »


Rispondi