es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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é?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    FILE_NAME="/test/path/test file with spaces.__1"
    
    PATTERN_STR='\.(?!ses\$)([^.]+\$)'
    
    if [[ "${FILE_NAME}" =~ ${PATTERN_STR} ]]; then
            Match_Result="true"
    else
            Match_Result="false"
    fi
    
    echo $Match_Result
    

    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.

Comments are closed.