¿Por qué Regex no funciona en bash/ksh mientras funciona bien en la línea de comandos?
Quiero excluir cualquier archivo que termine con ‘. ses’ o archivos sin extensión utilizando el siguiente patrón regex. Funciona bien en línea de comando pero no en una shell (bash/ksh).
Patrón regex: “ \\". ¡(ses\$) (\ [^.] + \$) \\ "
”
Ejemplos de nombres de archivo:
"/test/path/test file with spaces.__1" (se espera verdadero)
"/test/path/test file with spaces.ses" (se espera falso)
"/test/path/test file with spaces" (se espera falso)
"/test/path/test file with spaces.txt" (se espera verdadero)
“`FILE_NAME = “/test/path/test file with spaces._1”
PATTERN_STR = “. (?! ses \$) (\ [^.] + \$)”
if [[ “${FILE_NAME}” =~ $ {PATTERN_STR}]]; luego
Match_Result = "verdadero"
de lo contrario
Match_Result = "falso"
fin
echo $Match_Result
“`Retorna “verdadero”, pero “falso” en la shell. ¿Alguien sabe por qué?
davy.ai
El problema se encuentra en la forma en que se cita el patrón regex dentro del script shell. En bash/ksh, cuando el patrón regex está contenido dentro de comillas dobles, algunos caracteres dentro del patrón (como ‘$’) tienen un significado especial y deben ser escapados. Por lo tanto, el patrón regex debe estar contenido dentro de comillas simples para evitar que el shell interprete cualquier caracter especial dentro de él.
Script actualizado:
Al encerrar el patrón regex dentro de comillas simples se asegura que los caracteres especiales dentro de él no sean interpretados por el shell y se obtiene el resultado correcto.