En Linux, tengo un directorio con muchos archivos. Algunos de ellos tienen caracteres no ASCII, pero todos son UTF-8 válidos . Un programa tiene un error que impide que funcione con nombres de archivo que no son ASCII, y tengo que averiguar cuántos están afectados. Iba a hacer esto find
y luego hacer un grep para imprimir los caracteres que no son ASCII, y luego hacer un wc -l
para encontrar el número. No tiene que ser grep; Puedo usar cualquier expresión regular estándar de Unix , como Perl , sed , AWK , etc.
Sin embargo, ¿hay una expresión regular para 'cualquier carácter que no sea un carácter ASCII'?
/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Respuestas:
Esto coincidirá con un solo carácter no ASCII:
Esta es una PCRE ( expresión regular compatible con Perl) válida .
También puedes usar las manos cortas POSIX :
[[:ascii:]]
- coincide con un solo carácter ASCII[^[:ascii:]]
- coincide con un solo carácter no ASCII[^[:print:]]
probablemente sea suficiente para ti. **fuente
^
es válido en PCRE.:print:
no funcionará en un terminal UTF8? Esto funciona para mí en palanca en una terminal UTF8:27.chr =~ /[^[:print:]]/
rename 's/[^\x00-\x7F]//g' *
(puede usar-n
para verificar que los cambios de nombre estén bien primero).No,
[^\x20-\x7E]
no es ASCII.Esto es ASCII real:
De lo contrario, recortará nuevas líneas y otros caracteres especiales que forman parte de la tabla ASCII.
fuente
También puede consultar esta página: Expresiones regulares Unicode , ya que contiene algunas clases útiles de caracteres Unicode, como:
fuente
[^\x00-\x7F]
y[^[:ascii:]]
perder algunos bytes de control para que las cadenas puedan ser la mejor opción a veces. Por ejemplocat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'
, hará cosas extrañas en su terminal, dondestrings test.torrent
se comportará como.fuente
Para validar el cuadro de texto Aceptar Ascii Use solo este patrón
[\x00-\x7F]+
fuente
Yo uso
[^\t\r\n\x20-\x7E]+
y eso parece estar funcionando bien.fuente
Puedes usar esta expresión regular:
Caso pregunte, las opciones son Multilínea .
fuente
Realmente no necesitas una expresión regular.
Esto también mostrará nombres de archivos con caracteres de control en sus nombres, pero considero que es una característica.
Si no tiene ningún archivo coincidente, el globo se expandirá solo, a menos que lo haya
nullglob
configurado. (La expresión no coincide, por lo que técnicamente, esta salida no es ambigua).fuente
Esto resultó ser muy flexible y extensible. $ campo = ~ s / [^ \ x00- \ x7F] // g; # por lo tanto, todos los elementos no ASCII o específicos en cuestión podrían limpiarse. Muy agradable ya sea en la selección o en el procesamiento previo de los elementos que eventualmente se convertirán en claves hash.
fuente