[GNU/Linux] Regex

Fab996
Perchè se ho questo testo
"fsane
vfsdvfdzne" e utilizzo grep 'ne$' mi trova solamente fsane?

Risposte
killing_buddha
Forse perche' $ individua un a capo, che evidentemente se il tuo codice e'
1 fsane
2 vfsdvfdzne

e non
1 fsane
2 vfsdvfdzne
3 

la regex non sa trovare.

Fab996
Stavo vedendo che in realtà funziona anche senza andare a capo, più che altro non mi funziona in questo codice
ciao come staine
io tutto bene 
e tu
Sempre il comando grep 'ne$' trova solamente staine

apatriarca
Potresti mostrare in che modo usi grep? Sembra che grep si fermi al primo risultato.

Fab996
grep 'ne$' nomefile

apatriarca
A me funziona mostrando entrambe le righe.. Sicuro non ci siano spazi o altri caratteri prima della fine della riga? Su quale sistema stai facendo il test?

Fab996
Ok grazie, penso proprio che fosse un problema di spazi, ho riscritto la frase e funziona.
Invece avendo quest'altra istruzione
sed '/^ciao/,/^come/s/A/_/' 
dovrebbe sostituire A con _ se A è compresa tra ciao e come?
Quindi come può esser fatto un file di testo che rispecchia questo pattern?

anonymous_be1147
ciao
bastA usAre
un esempio
come questo

Fab996
"anonymous_be1147":
ciao
bastA usAre
un esempio
come questo


Grazie :lol:
Però non capisco avendo questo testo:
gfdsgs
sgs
fgs
gs
ciao
fafdagfd...agda
come

se eseguo
sed '/^ciao/^come/s/.../_/'
perchè non mi sostituisce i ... con _ ?

anonymous_be1147
Perché il punto corrisponde a un qualsiasi caratttere (non al carattere . ) e quindi vengono sostituiti i primi 3 caratteri incontrati (cia etc nel tuo esempio[nota]Ammesso di correggere chiaramente il comando sed in [inline]sed '/^ciao/,/^come/s/.../_/'[/inline] - (manca una virgola). La versione corretta sarebbe quindi [inline]sed '/^ciao/,/^come/s/\.\.\./_/'[/inline][/nota])

Fab996
Grazie, scusa se ti rispondo adesso.

Fab996
Scusa avrei un altro dubbio riguardo il comando sed, perchè a volte si mette lo $/$ mentre altre volte no ? Per esempio eliminare le ultime due righe
sed '2,$d'
mentre eliminare una riga vuota
sed '/^$/d'

anonymous_be1147
Be', semplificando molto, un'istruzione per sed può essere costituita da 0, 1 oppure 2 indirizzi, a cui segue una funzione (comando). Nel tuo caso la funzione è d (delete=elimina). Ora un indirizzo può essere: un'espressione regolare, un numero (di riga) oppure il simbolo di dollaro (che corrisponde all'ultima riga dell'input). Due indirizzi sono separati da una virgola. Gli indirizzi servono in genere per selezionare le righe su cui operare.

Nel primo caso hai 2 indirizzi (separati dalla virgola) e una funzione di sed (d=elimina), nel secondo caso invece hai 1 indirizzo (l'espressione regolare) e la funzione d, che verrà applicata alle righe sulle quali si ha corrispondenza con l'espressione regolare.

Quindi il comando [inline]sed '2,$d'[/inline] elimina tutte le righe a partire dalla seconda fino all'ultima dell'input. In pratica [inline]2,$[/inline] seleziona un intervallo di righe: dalla 2 fino all'ultima.

Un'espressione regolare è di solito delimitata dal carattere /, ma nulla vieta di usare un'altro carattere a piacere (in questo caso va "dichiarato", facendolo precedere da un backslash \ ). Ad esempio. il secondo comando potrebbere essere scritto anche: [inline]sed '\x^$xd'[/inline] oppure [inline]sed '\,^$,d'[/inline] o ancora [inline]sed '\d^$dd[/inline] etc.

In ogni caso è tutto spiegato in dettaglio nella manpage del comando sed (per il tuo sistema operativo, perché ci sono varie versioni di sed in giro). :)

Fab996
Grazie mille :)
ps. quindi due indirizzi formano un range ?

anonymous_be1147
Esatto.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.