Bash: Regex para comparar la ruta del archivo

Bash: Regex para comparar la ruta del archivo

Quiero verificar si una cadena de entrada coincide con las rutas de archivo incluidas en la lista blanca, luego solo quiero realizar alguna operación.

estoy haciendo algo como esto

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

¿Dónde, si los caminos son como

mydir/test/dir
mydir/othertest/dir

Estos deberían pasar.

La verificación anterior me está dando un error.

assets/bin/copymain: line 8: [: too many arguments

Respuesta1

Tenga en cuenta que si el único requisito es comparar rutas/cadenas que terminan o comienzan de cierta manera, entonces no se necesitan expresiones regulares:

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

Respuesta2

path1="mydir/**"
path2="mydir/testing"

Aquí path1="mydir/**"se utiliza un patrón global que es un lenguaje totalmente diferente al de la expresión regular extendida utilizada en la comparación.

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

Pero las condiciones utilizan una expresión regular:

[[ "$path2" =~ "$path1" ]]

No agregue espacios entre [ [y ] ]pero [[y]]

La expansión de parámetros global y Regex son dos lenguajes de patrones diferentes.

Si $path1contiene el patrón de lista blanca, debe escribirlo en RegEx de esta manera:

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

El lado derecho es la variable RegEx path1y no se debe citar, ya que eso haría que los operadores de expresiones regulares (como los ^anteriores) se tomen literalmente (a menos que configure la compat31opción o establezca BASH_COMPAT=3.1).

información relacionada