[GNU/Linux] Regex
Perchè se ho questo testo
"fsane
vfsdvfdzne" e utilizzo grep 'ne$' mi trova solamente fsane?
"fsane
vfsdvfdzne" e utilizzo grep 'ne$' mi trova solamente fsane?
Risposte
Forse perche' $ individua un a capo, che evidentemente se il tuo codice e'
e non
la regex non sa trovare.
1 fsane 2 vfsdvfdzne
e non
1 fsane 2 vfsdvfdzne 3
la regex non sa trovare.
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 tuSempre il comando grep 'ne$' trova solamente staine
Potresti mostrare in che modo usi grep? Sembra che grep si fermi al primo risultato.
grep 'ne$' nomefile
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?
Ok grazie, penso proprio che fosse un problema di spazi, ho riscritto la frase e funziona.
Invece avendo quest'altra istruzione
Quindi come può esser fatto un file di testo che rispecchia questo pattern?
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?
ciao
bastA usAre
un esempio
come questo
bastA usAre
un esempio
come questo
"anonymous_be1147":
ciao
bastA usAre
un esempio
come questo
Grazie

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 _ ?
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])
Grazie, scusa se ti rispondo adesso.
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'
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).
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).

Grazie mille 
ps. quindi due indirizzi formano un range ?

ps. quindi due indirizzi formano un range ?
Esatto.