Continuando con el tema del post anterior, consideremos el listado del directorio del contenido mencionado:
$> ls
| 1.gif | Archivo.pdf | PDRM76565.jpg | docto.doc |
| 1post.txt | B | PRDM43453.JPG | post.txt |
| 345.pdf | B17646.pdf | a.txt | reporteABC.xls |
| 7657656hs.tff | GAS.doc | aBejas.gif | test.txt |
e imaginemos que deseamos listar todos aquellos archivos cuyo nombre (sin incluir la extensión) fueran únicamente números. Un primer intento sería:
$> ls * | awk '/[0-9]/'
1.gif
1post.txt
345.pdf
7657656hs.tff
B17646.pdf
PDRM76565.jpg
PRDM43453.JPG
aunque muestra archivos cuyo nombre lleva letras y números no solamente números. Un segundo intento podría ser buscar explícitamente aquello que inicie y termine con números y no tenga letras entre esto:
$> ls * | awk '/[0-9]+[^A-Za-z][0-9]+/'
345.pdf
7657656hs.tff
B17646.pdf
PDRM76565.jpg
PRDM43453.JPG
pero éste, por lo que ya sabemos fallará y así podemos verlo. Si modificamos el script pensando que una cerradura y anclas pudieran hacer el trabajo veremos que nuestro razonamiento no es recompensado.
$> ls * | awk '/^[0-9]+[^A-Za-z]*[0-9]+.*$/'
345.pdf
7657656hs.tff
¿Qué es lo que falla? Para este caso en particular debemos entender que la lista de caracteres complementada para excluir letras mayúsculas y minúsculas no evita que archivos en cuyo nombre aparece algo más que sólo números se incluyan. Independientemente de que sobre esta clase se esté usando una cerradura positiva o de Kleene, un archivo con letras en su nombre es incluido, porque para la ER
/^[0-9]+[^A-Za-z]*[0-9]+.*$/
el caso 7657656hs.tff resultará verdadero. Para el caso
^[0-9]+[0-9]+.*$
que está contemplado en la expresión regular original: los números al inicio del nombre de archivo empatan con ^[0-9]+[0-9]+ y .* permite empatar con el sufijo del nombre y la extensión. Para poder mostrar únicamente los nombres de los archivos que sean formados por números debemos pensar en una ER que por complemento incluya a los dígitos numéricos. Una solución es
$> ls * | awk '/^[^!-\/:-~]+\..+$/'
1.gif
345.pdf
La ER en este caso denota el conjunto de caracteres formados por dos rangos. El primero incluye a todos los caracteres previos a los dígitos y el segundo los posteriores. El circunflejo indica que se considere el complemento de estos rangos. En otras palabras, es una ER que empatará todos aquellos caracteres que no sean letras o símbolos ortográficos, o sea, dígitos numéricos.
