Find Y Problema Con Las Expresiones Regulares
Buenas!.
Pues el problema que me encontré fue que usando expresiones regulares por ejemplo con un juego llamado:
Impossible Mission también existía Impossible Mission II
A la hora de buscar Impossible Mission
find . -regex '\(.*Impossible Mission.*\)$*.tzx'
Salida:
Citar:
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission II (1988)(US Gold)[b].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission II (19xx)(Kixx)(Side A)[Re-Release].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission II (1988)(US Gold).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(US Gold)[a].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(Ricochet)[Re Release].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(Compulogical - US Gold)(Es).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission II (19xx)(Kixx)(Side B)[Re-Release].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1987)(Erbe - US Gold)(Es).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(US Gold).tzx
Entonces, ¿ como podía mostrar solo su primera parte ?.
Impossible Mission II tiene un espacio después del nombre y los caracteres II
Me interesa que se muestre cualquier línea que incluya Impossible Mission más un espacio y que no se muestre uno o más caracteres "I" y al final que la extensión tenga .tzx
Traduciéndolo a expresión regular.
find . -regex '\(.*Impossible Mission\s[^I]+\)$*.tzx'
Citar:
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(US Gold)[a].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(Ricochet)[Re Release].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(Compulogical - US Gold)(Es).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1987)(Erbe - US Gold)(Es).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(US Gold).tzx
. Cualquier caracter
.* Repite un caracter hasta donde le digamos
\s espacio en blanco
[I] Coincide con ese caracter
[^I] No coincide con ese caracter.
+ y * son casi parecidos.
$ coincide al final de la línea
Y ahora aprovechando las expresiones regulares para encontrar tres juegos usé:
El asterisco se podría haber sustituido por el signo "+"
find . -regex '\(.*Impossible Mission\s[^I].*\|.*Kendo.*\|.*Jetpac.*\)$*.tzx'
Salida:
Citar:
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/J/Jetpac (1983)(Ultimate)[a2].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/J/Jetpac (1983)(Ultimate).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/J/Jetpac (1983)(Ultimate)[a].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/K/Kendo Warrior (1989)(Byte Back)[Re-Release].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/K/Kendo Warrior (1989)(Byte Back).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(US Gold)[a].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(Ricochet)[Re Release].tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(Compulogical - US Gold)(Es).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1987)(Erbe - US Gold)(Es).tzx
./Ordenadores/8bits/Spectrum/Coleccion/Tzx/I/Impossible Mission (1985)(US Gold).tzx
Sin expresiones regulares:
find . -type f \( -iname "*impossible*" -not -iname "*II*" -o -iname "JetPac*" -o -iname "kendo w*" \) -and -name \*.tzx
Con expresiones regulares. Añadamos también que quiero mostrar solo archivos.
find . -type f -regex '\(.*Impossible Mission\s[^I].*\|.*Kendo.*\|.*Jetpac.*\)$*.tzx'
Cuestión de costumbres y usar el más adecuado. El primer método es más largo y no es complicado, el segundo es más corto y algo enrevesado.
Saludos
===================
Gambas Básico
"No es un bug, es una característica no documentada"