La respuesta aceptada está bien si puedes usar lookarounds. Sin embargo, también hay otro enfoque para resolver este problema.
Si miramos la expresión regular ampliamente propuesta para esta pregunta:
.*[^a]$
Encontraremos que casi funciona. No acepta una cadena vacía, lo que puede ser un poco incómodo. Sin embargo, este es un problema menor cuando se trata de un solo personaje. Sin embargo, si queremos excluir una cadena completa, por ejemplo, "abc", entonces:
.*[^a][^b][^c]$
no lo haré No aceptará ac, por ejemplo.
Sin embargo, hay una solución fácil para este problema. Simplemente podemos decir:
.{,2}$|.*[^a][^b][^c]$
o versión más generalizada:
.{,n-1}$|.*[^firstchar][^secondchar]$
donde n es la longitud de la cadena que desea prohibir (porque abc
es 3), y firstchar
, secondchar
... son los primeros, segundos ... enésimos caracteres de su cadena (porque abc
sería a
, entonces b
, entonces c
).
Esto proviene de una simple observación de que una cadena que es más corta que el texto que no prohibiremos no puede contener este texto por definición. Por lo tanto, podemos aceptar cualquier cosa que sea más corta ("ab" no es "abc"), o cualquier cosa que podamos aceptar pero sin el final.
Aquí hay un ejemplo de búsqueda que eliminará todos los archivos que no sean .jpg:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete