Documentos de Académico
Documentos de Profesional
Documentos de Cultura
genéricos
Los caracteres genéricos son caracteres especiales dedicados a la escritura de motivos en los nombres de archivo.
Permiten efectuar una búsqueda según un motivo por los nombres de archivo presentes en el directorio actual.
Los ejemplos de esta sección se basan en un directorio con los archivos siguientes:
[javier]$ ls -a
. banco azul arch1 arch2.4 .os rosado
.. blanco ejemplos arch2 arch2.7 redonda rojo
El asterisco: *
Cuando el Bash encuentra este carácter en la línea de comandos, lo sustituye por una cadena de caracteres (que
puede ser de longitud nula) para enumerar todos los nombres de archivo que corresponden al motivo en el directorio
actual.
Así, el motivo r*o se reemplaza por todos los nombres de archivo que empiezan por el carácter r y terminan con el
carácter o:
[javier]$ ls r*o
rosado rojo
El signo * reemplaza cualquier carácter en el motivo, excepto el . (punto) en primera posición en el nombre de
archivo; por ejemplo, el motivo *s corresponde al archivo ejemplos, pero no al archivo .os:
[javier]$ ls *s
ejemplos
Un motivo puede estar compuesto por varios caracteres genéricos; repitiendo el asterisco, se obtiene, por ejemplo,
*e* que concuerda con todos los archivos con al menos una e en su nombre:
[javier]$ ls *e*
ejemplos redonda
Finalmente, si el shell no encuentra correspondencias con el motivo entre los nombres de archivo presentes en el
directorio actual, dicho motivo se transmite tal cual al comando:
[javier]$ ls *zork
ls: *zork: No such file or directory
© Éditions ENI – Todos los derechos reservados – Copia personal de Luis Montalvan - 1-
En este último ejemplo, ningún nombre de archivo se corresponde con el motivo *zork; el comando ls recibe el motivo
como argumento y lo devuelve en su mensaje de error.
Esta observación es válida también para los caracteres genéricos siguientes.
El signo de interrogación: ?
Como el signo *, el shell sustituye el carácter genérico ? por cualquier carácter, excepto el punto, al principio de un
nombre de archivo. A diferencia del asterisco, el signo de interrogación se reemplaza por un carácter (y sólo uno), y
no por una cadena de cualquier longitud.
Así, el motivo ro?o corresponde a todos los nombres de archivo de exactamente cuatro caracteres que empiezan por
ro y terminan por o:
[javier]$ ls ro?o
rojo
De nuevo, este carácter genérico puede combinarse con otros en el mismo motivo:
?a? Nombre de archivo de tres letras con una a en segunda posición.
*a? Nombre de archivo que presenta una a en penúltima posición.
??a*b? Nombre de archivo que presenta una a en tercera posición y una b en penúltima posición.
Los corchetes: [ ]
La sintaxis [lista_de_caracteres] en un motivo representa un carácter (y sólo uno) entre los propuestos en la lista.
Por ejemplo, [abc] se reemplaza por una a, una b o una c.
Todo carácter situado entre los corchetes forma parte de la lista de posibles caracteres; no hay, pues, espacios entre
los corchetes, a menos que el espacio sea un carácter posible de la lista.
Para listar todos los archivos cuyo nombre contiene una o o una l en segunda posición, se usa el motivo ?[ol]*:
[javier]$ ls ?[ol]*
rosado rojo blanco
Es posible simplificar listas de caracteres consecutivos (según el orden de la tabla ASCII) separando el primero y el
último carácter de la lista con un (guión). La sintaxis [b-e] equivale a [bcde]:
[javier]$ ls [b-e]*
banco blanco ejemplos
- 2- © Éditions ENI – Todos los derechos reservados – Copia personal de Luis Montalvan
Para especificar el carácter como elemento de la lista, se inserta al principio o al fin de la lista: [ab-] corresponde a
a, a b o a -.
Al ser las minúsculas y las mayúsculas distintas en Linux, para representar todas las letras posibles del alfabeto en
un nombre de archivo, se usa la sintaxis [a-zA-Z].
Si el primer carácter de la lista es un signo de exclamación ! o un acento circunflejo ˆ, la correspondencia se hace con
cualquier carácter que no esté en la lista; para listar todos los archivos cuyo nombre no empiece por a, ni par un r:
[javier]$ ls [!ar]*
banco blanco ejemplos
[javier]$ ls [ˆar]*
banco blanco ejemplos
Finalmente, existen ciertas clases de caracteres predefinidas. Sus nombres son bastante explícitos: [:alpha:],
[:digit:], ... por ejemplo, [[:alnum:]] corresponde a [0-9A-Za-z], con la diferencia de que el último caso depende
de la codificación ASCII, mientras que el primero incluye todas las letras del idioma configurado en el sistema.
Por ejemplo, los caracteres acentuados forman parte de la clase [:alnum:] en español, pero no en lenguaje
internacional C ANSI:
[javier]$ ls
espacio satélite
[javier]$ echo $LANG
sp_SP
[javier]$ ls [[:alnum:]]*
espacio satélite
[javier]$ LANG=C
[javier]$ ls [[:alnum:]]*
espacio
Los corchetes en los nombres de clases forman parte integral del nombre simbólico; deben añadirse, pues, a los
corchetes que enmarcan la lista.
Las principales clases son:
[:alnum:]
Corresponde a los caracteres alfabéticos y numéricos. Equivale a [A-Za-z0-9].
[:alpha:]
Corresponde a los caracteres alfabéticos. Equivale a [A-Za-z].
[:digit:]
© Éditions ENI – Todos los derechos reservados – Copia personal de Luis Montalvan - 3-
Corresponde a las cifras (decimales). Equivale a [0-9].
[:graph:]
(caracteres gráficos visibles). Corresponde a los caracteres comprendidos entre ASCII 33 y ASCII 126.
Es idéntico a [:print:], presentado anteriormente, pero excluye el carácter espacio.
[:lower:]
Corresponde a los caracteres alfabéticos en minúscula. Equivale a [a-z].
[:print:]
(caracteres imprimibles). Corresponde a los caracteres comprendidos entre ASCII 32 y ASCII 126.
Equivale a [:graph:], presentado anteriormente, pero se añade el carácter espacio.
[:space:]
Corresponde a cualquier espacio en blanco (espacio y tabulación horizontal).
[:upper:]
Corresponde a cualquier carácter alfabético en mayúsculas. Equivale a [A-Z].
[:xdigit:]
Corresponde a las cifras hexadecimales. Equivale a [0-9A-Fa-f].
Para todos los nombres de archivo cuyo último carácter es una cifra, se obtiene:
[javier]$ ls *[[:digit:]]
arch1 arch2 arch2.4 arch2.7
Las llaves: {}
A la manera de los corchetes que ya hemos visto para la creación de listas de caracteres, las llaves permiten
especificar listas de motivos separadas por una coma en un motivo de reemplazo. La sintaxis {abc,def} se reemplaza
por la cadena abc o la cadena def.
Por ejemplo, {az,ro}* corresponde a todos los nombres de archivo que empiezan por la cadena az o la cadena ro:
[javier]$ ls {az,ro}*
azul rosado rojo
Las cadenas de caracteres presentes entre llaves pueden ser, a su vez, motivos compuestos de caracteres
genéricos:
[javier]$ ls {*ro[sj]*,?a*}
- 4- © Éditions ENI – Todos los derechos reservados – Copia personal de Luis Montalvan
banco rosado rojo
Operadores de correspondencia extendida
Si la opción extglob del shell se ha activado con el comando shopt, se reconocen varios operadores de
correspondencia extendida. En la descripción siguiente, una "lista_motivo" es una lista de uno o más motivos
separados por |. Los motivos compuestos se indican entre paréntesis y van precedidos por un operador que define el
número de instancias:
?(lista_motivo)
Corresponde a cero o una instancia de los motivos indicados.
*(lista_motivo)
Corresponde a cero o más instancias de los motivos indicados.
+(lista_motivo)
Corresponde a una o más instancias de los motivos indicados.
@(lista_motivo)
Corresponde a exactamente una instancia de los motivos indicados.
!(lista_motivo)
Corresponde a todo salvo a los motivos indicados.
Por ejemplo, +([[:digit:]])* corresponde a todos los archivos cuyo nombre empieza por al menos una cifra.
© Éditions ENI – Todos los derechos reservados – Copia personal de Luis Montalvan - 5-