2012-07-20 10 views

risposta

15

Perl supporta una classe [:ascii:] carattere.

perl -nle 'print if m{^[[:ascii:]]+$}' inputfile 
+0

Grazie. Questo ha funzionato perfettamente. – Sudar

2

È possibile utilizzare egrep -v per restituire solo le linee non che corrispondono al modello e usare qualcosa come [^ a-zA-Z0-9.,;:-'"?!] come modello (includere più di punteggiatura, se necessario).

Hm, ripensandoci, una doppia negazione (-v e la classe di caratteri invertita) non è probabilmente quella buona. Un altro modo potrebbe essere ^[ a-zA-Z0-9.,;:-'"?!]*$.

È anche possibile filtrare per ASCII:

egrep -v "[^ -~]" foo.txt 
+0

ho bisogno di tutto la punteggiatura. Quindi è possibile filtrare tutti i caratteri non ascii, invece di specificare l'elenco dei caratteri consentiti? – Sudar

+1

È forse tangenziale al punto principale, ma l'intervallo [a-z] include caratteri non ascii in alcune impostazioni internazionali. Ad esempio, sul mio sistema, 'echo é | grep [a-z] 'trova l'é. – Anachrome

1

È possibile utilizzare Awk, a patto di forzare l'uso del locale C:

LC_CTYPE=C awk '! /[^[:alnum:][:space:][:punct:]]/' my_file 

La variabile di ambiente LC_TYPE=C (o LC_ALL=C) forzare l'uso del locale C per la classificazione dei caratteri. Cambia il significato delle classi di caratteri ([:alnum:], [:space:], ecc.) Per far corrispondere solo caratteri ASCII.

Il /[^[:alnum:][:space:][:punct:]]/ regex le righe di corrispondenza con qualsiasi carattere non ASCII. Lo ! prima della regex inverte la condizione. Quindi solo le righe senza caratteri non ASCII corrisponderanno. Quindi, poiché non viene fornita alcuna azione, l'azione predefinita viene utilizzata per le linee corrispondenti (print).

EDIT: Questo può essere fatto anche con grep:

LC_CTYPE=C grep -v '[^[:alnum:][:space:][:punct:]]' my_file 
1

Con GNU grep, che supporta espressioni regolari Perl compatibili, è possibile utilizzare:

grep -P '^[[:ascii:]]+$' file 
Problemi correlati