<Anterior | Contenido | Siguiente>
Clases de caracteres POSIX
Los rangos de caracteres tradicionales son una forma fácil de entender y eficaz de manejar el problema de especificar rápidamente conjuntos de caracteres. Desafortunadamente, no siempre funcionan. Si bien no hemos encontrado ningún problema con el uso de grep Hasta ahora, podríamos tener problemas al utilizar otros programas.
En el Capítulo 4, analizamos cómo se utilizan los comodines para realizar la expansión de nombre de ruta. En esa discusión, dijimos que los rangos de caracteres podrían usarse de una manera casi idéntica a la forma en que se usan en las expresiones regulares, pero aquí está el problema:
[yo @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
[yo @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
(Dependiendo de la distribución de Linux, obtendremos una lista diferente de archivos, posiblemente una lista vacía. Este ejemplo es de Ubuntu). Este comando produce el resultado esperado - una lista de solo los archivos cuyos nombres comienzan con una letra mayúscula, pero:
[yo @ linuxbox ~] $ ls / usr / sbin / [AZ] *
/ usr / sbin / biosdecode
/ usr / sbin / chat
/ usr / sbin / chgpasswd
/ usr / sbin / chpasswd
/ usr / sbin / chroot
/ usr / sbin / cleanup-info
/ usr / sbin / quejarse
/ usr / sbin / console-kit-daemon
[yo @ linuxbox ~] $ ls / usr / sbin / [AZ] *
/ usr / sbin / biosdecode
/ usr / sbin / chat
/ usr / sbin / chgpasswd
/ usr / sbin / chpasswd
/ usr / sbin / chroot
/ usr / sbin / cleanup-info
/ usr / sbin / quejarse
/ usr / sbin / console-kit-daemon
con este comando obtenemos un resultado completamente diferente (solo se muestra una lista parcial de los resultados). ¿Porqué es eso? Es una historia larga, pero aquí está la versión corta:
Cuando se desarrolló Unix por primera vez, solo conocía los caracteres ASCII, y esta característica refleja ese hecho. En ASCII, los primeros 32 caracteres (números 0-31) son códigos de control (cosas como tabulaciones, retrocesos y retornos de carro). Los siguientes 32 (32-63) contienen caracteres imprimibles, incluida la mayoría de los caracteres de puntuación y los números del cero al nueve. Los siguientes 32 (números 64-95) contienen las letras mayúsculas y algunos símbolos de puntuación más. Los 31 finales (números 96-127) contienen letras minúsculas y aún más símbolos de puntuación. Sobre la base de esta disposición, los sistemas que utilizan ASCII utilizaron un orden de colación que se veía así:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz Esto difiere del orden correcto del diccionario, que es así: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuXUyvVwZWx
A medida que la popularidad de Unix se extendió más allá de los Estados Unidos, creció la necesidad de admitir caracteres que no se encuentran en el inglés estadounidense. La tabla ASCII se expandió para usar ocho bits completos, agregando números de caracteres 128-255, que se adaptaron a muchos más idiomas. Para respaldar esta capacidad, los estándares POSIX introdujeron un concepto llamado local, que podría ajustarse para seleccionar el juego de caracteres necesario para una ubicación en particular. Podemos ver la configuración de idioma de nuestro sistema usando este comando:
[yo @ linuxbox ~] $ echo $ LANG
en_US.UTF-8
[yo @ linuxbox ~] $ echo $ LANG
en_US.UTF-8
Con esta configuración, las aplicaciones compatibles con POSIX utilizarán un orden de clasificación de diccionario en lugar de un orden ASCII. Esto explica el comportamiento de los comandos anteriores. Una gama de caracteres de [ARIZONA] cuando se interpreta en orden de diccionario incluye todos los caracteres alfabéticos excepto la “a” minúscula, de ahí nuestros resultados.
Para solucionar parcialmente este problema, el estándar POSIX incluye una serie de clases de caracteres que proporcionan rangos de caracteres útiles. Se describen en la tabla a continuación.
bajo:
Tabla 19-2: Clases de caracteres POSIX
Descripción de la clase de personaje
Descripción de la clase de personaje
[: alnum:] Los caracteres alfanuméricos. En ASCII, equivalente a:
[A-Za-z0-9]
[:palabra:] Lo mismo que [: alnum:], con la adición del guión bajo (_) personaje.
[: alpha:] Los caracteres alfabéticos. En ASCII, equivalente a:
[A-Za-z]
[: en blanco:] Incluye el espacio y los caracteres de tabulación.
[: cntrl:] Los códigos de control ASCII. Incluye los caracteres ASCII del 0 al 31 y 127.
[: dígito:] Los números del cero al nueve.
[: gráfico:] Los caracteres visibles. En ASCII, incluye caracteres 33
A través de 126.
[: inferior:] Las letras minúsculas.
[: punt:] Los caracteres de puntuación. En ASCII, equivalente a:
[-! "# $% & '() * +,. / :; <=>? @ [\\\] _` {|} ~]
[: imprimir:] Los caracteres imprimibles. Todos los personajes de [:grafico:]
más el carácter de espacio.
[: espacio:] Los caracteres de espacio en blanco, incluido el espacio, tabulación, carro
retorno, nueva línea, tabulación vertical y avance de página. En ASCII, equivalente a:
[\ t \ r \ n \ v \ f]
[: superior:] Los caracteres en mayúscula.
[: xdigit:] Caracteres utilizados para expresar números hexadecimales. En ASCII, equivalente a:
[0-9A-Fa-f]
Incluso con las clases de caracteres, todavía no hay una forma conveniente de expresar rangos parciales, como [AM].
Usando clases de caracteres, podemos repetir nuestra lista de directorios y ver un resultado mejorado:
[yo @ linuxbox ~] $ ls / usr / sbin / [[: superior:]] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
[yo @ linuxbox ~] $ ls / usr / sbin / [[: superior:]] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
Sin embargo, recuerde que este no es un ejemplo de una expresión regular, sino que es el shell que realiza la expansión del nombre de la ruta. Lo mostramos aquí porque las clases de caracteres POSIX se pueden usar para ambos.
Revertir al orden de clasificación tradicional
Puede optar por que su sistema utilice el orden de clasificación tradicional (ASCII) cambiando el valor del IDIOMA Variable ambiental. Como vimos arriba, el IDIOMA La variable contiene el nombre del idioma y el juego de caracteres utilizados en su configuración regional. Este valor se determinó originalmente cuando seleccionó un idioma de instalación cuando se instaló su Linux.
Para ver la configuración regional, use el local mando:
[yo @ linuxbox ~] $ local LANG = en_US.UTF-8 LC_CTYPE = "en_US.UTF-8" LC_NUMERIC = "en_US.UTF-8" LC_TIME = "en_US.UTF-8" LC_COLLATE = "en_US.UTF-8" LC_MONETARY = "en_US.UTF- 8 "LC_MESSAGES =" en_US.UTF-8 "LC_PAPER =" en_US.UTF-8 "LC_NAME =" en_US.UTF-8 "LC_ADDRESS =" en_US.UTF-8 "LC_TELEPHONE =" en_US.UTF-8 "LC_MEASUREMENT =" en_US.UTF-8 "LC_IDENTIFICATION =" en_US.UTF-8 "LC_ALL =
Para cambiar la configuración regional para usar los comportamientos tradicionales de Unix, configure el IDIOMA variable a POSIX:
[yo @ linuxbox ~] $ exportar LANG = POSIX
Tenga en cuenta que este cambio convierte el sistema para utilizar el inglés de EE. UU. (Más específicamente, ASCII) para su conjunto de caracteres, así que asegúrese de que esto sea realmente lo que desea.
Puede hacer que este cambio sea permanente agregando esta línea a su .bashrc
archivo:
exportar LANG = POSIX