Expresiones regulares en un shell

Expresiones regulares en un shell

Tengo dos preguntas sobre el uso de expresiones regulares dentro de un shell.

1. Uso de *

De acuerdo apágina de wikipedia sobre expresiones regulares:

*: El asterisco indica que hay cero o más del elemento anterior. Por ejemplo, ab*c coincide con "ac", "abc", "abbc", "abbbc", etc.

Sin embargo, cuando escribo rm test*.iso, eliminará todos los archivos que comiencen con "prueba" y terminen con ".iso", lo que haya (o no) entre "prueba" y ".iso". Entonces, el archivo "tes.iso" seránoeliminado.

Si tomas el ejemplo de abc, según wikipedia, "ab*c" coincide con "ac". Por lo tanto rm ab*cconviene eliminar un archivo "ac".¿Por qué rm no utiliza expresiones regulares como las describe Wikipedia?

2. Uso de - y ?

Todavía segúnpágina de wikipedia sobre expresiones regulares:

?: El signo de interrogación indica que hay cero o uno del elemento anterior. Por ejemplo, color coincide con "color" y "color".

+: El signo más indica que hay uno o más de los elementos anteriores. Por ejemplo, ab+c coincide con "abc", "abbc", "abbbc", etc., pero no con "ac".

"?" parece funcionar como "*", es decir "?" El símbolo reemplaza uno o cero elemento (pero no el anterior, al contrario de lo que dice Wikipedia).

No sé cómo usar "+" y esta es mi segunda pregunta. También me interesan los trucos relacionados con las expresiones regulares y rm, cp, ....

Respuesta1

el caparazónnotación de coincidencia de patronesse describe eneste documento de estándares.

Como dice el documento en su introducción, la notación de coincidencia de patrones está relacionada con la notación de expresiones regulares, pero es ligeramente diferente.

En particular, ?en el shell actúa como .en una expresión regular, y *en el shell actúa como .*en una expresión regular. (Pero ninguno de ellos coincidirá con a .al principio de un nombre de archivo). +en el shell no tiene ninguna capacidad especial de coincidencia de patrones. Sin embargo, como dice @HaukeLaging en su respuesta, ciertos shells pueden tener opcionalmente habilitada la notación de expresiones regulares, aunque hacerlo no es estándar.

Respuesta2

El shell utiliza expresiones regulares solo bajo ciertas condiciones (que probablemente difieren de un shell a otro).

En bashtienes que activarlos con:shopt -s extglob

Después de eso puedes usar algo como:

echo a*(b)c

Ver el bloque Pattern Matchingen man bash.

información relacionada