Abbinamento di caratteri speciali con espressione regolare


10

Di 'che è molto semplice se voglio trovare qualcosa che contiene lettere minuscole e numeri con

produce_testo | grep -E '[0-9a-z]'

Le parentesi sono utili per abbinare una serie di personaggi, ma per quanto riguarda quelli che sono in qualche modo speciali?
Se voglio, usando le parentesi, abbinare qualsiasi carattere tranne uno di questi: una parentesi quadra chiusa ], un trattino (o trattino) "-", entrambe le barre /e \, un cursore ^, due punti :.
Sarà così (so che non funziona)?

[^] - / \ ^:]

Risposte:


11

Per abbinare un letterale ]e un letterale -in un'espressione di parentesi devi usarli in questo modo:

[^]/\^:-]

o, ancora meglio, dal momento che alcuni strumenti richiedono che la barra rovesciata sia salvata :

[^]/\\^:-]

vale a dire
La parentesi quadra di destra (']') perderà il suo significato speciale e si rappresenterà in un'espressione di parentesi se compare per prima nell'elenco (dopo un '^' iniziale, se presente)
e
Il carattere trattino-meno essere trattato come se fosse il primo (dopo un '^' iniziale, se presente) o l'ultimo nell'elenco
quindi
se un'espressione di parentesi specifica sia '-' che ']', il ']' deve essere posizionato per primo (dopo il '^', se presente) e '-' durano all'interno dell'espressione parentesi.
Le regole per le espressioni tra parentesi sono le stesse per ERE e BRE .


2
Raddoppierei la barra rovesciata per essere al sicuro. È necessario con molte awkimplementazioni e perlper esempio.
Stéphane Chazelas,

Che dire di "Dal cursore alla staffa di chiusura"? Come [^-]](questo fallisce)?
iBug

2
@iBug - sicuro che fallisce perché la parentesi giusta deve essere la prima se vuoi abbinarla letteralmente. Io non sono sicuro di ottenere il punto di quel "range" che me lo dici come ^è dopo ]così [^-]]non avrebbe funzionato anche se entrambi ^e ]sono stati trattati letteralmente (come [b-a]). Ad ogni modo, se si desidera abbinare, ad esempio, dalla ;parentesi quadra chiusa, è possibile utilizzare un intervallo fino al carattere precedente ](che è una barra rovesciata) e includere ]come primo carattere nell'espressione parentesi quadre, ad esempio [];-\\].
don_crissti,

@don_crissti Che dire [[.^.]-[.-.]]? Ho la sensazione che questo avrebbe funzionato. Supponiamo che il codice ASCII di ^sia precedente -.
iBug

Ho una soluzione pigra per la mia domanda. Semplicemente ottenere tutto speciale per i personaggi di fascicolazione, come[^[.].][.-.]/\^:]
iBug

7

Stranamente forse, devi avere un paio di personaggi in luoghi specifici. Devi avere ]come primo personaggio di un set e -deve essere l'ultimo personaggio di un set.

Ecco un RE che soddisfa le tue esigenze [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
Non è davvero strano, è solo necessario evitare l'ambiguità
Kevin

1
Il secondo [personaggio non appartiene lì; l'OP non vuole escluderlo.
Scott,

@Scott ben individuato, grazie. Risposta aggiornata
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.