Complemented character list (2)

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.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s