Estoy buscando escribir una expresión regular para que coincida con las siguientes rutas.
puts/push/1234/request puts/push/57689/request puts/push/123/request puts/push/4567/request puts/push/34/requestTenga un nombre de variable Targetpath y cualquiera de las rutas anteriores podría ser su valor. Tengo la siguiente expresión condicional para realizar el partido.
if [[ $Targetpath =~ puts/push/*/request ]]; then echo 1; else echo 0; fiPero la coincidencia no está sucediendo y siempre se obtiene 0 echod en la terminal.
Cómo se debe modificar el comando anterior para realizar la coincidencia correcta.
Intente usar la siguiente cadena de expresiones regulares, modifique la cantidad de números si es necesario
regex="puts\/push\/[0-9]{2,}\/request" if [[ $var =~ $regex ]]; then echo 1; else echo 0; fiSi planea hacer coincidir cualquier texto pero / en lugar de su * , puede usar
if [[ $Targetpath =~ puts/push/[^/]+/request ]]; Tenga en cuenta que [^/]+ es una expresión de paréntesis negada que coincide con uno o más (ya que + en POSIX ERE es uno o más cuantificadores) caracteres que no sean / char.
O, si tiene la intención de hacer coincidir los dígitos donde está su * :
if [[ $Targetpath =~ puts/push/[0-9]+/request ]]; Aquí, [0-9]+ (o [[:digit:]]+ ) coincide con uno o más dígitos.
Aquí hay una demostración rápida :
#!/bin/bash Targetpath='puts/push/1234/request' rx='puts/push/[0-9]+/request' if [[ "$Targetpath" =~ $rx ]]; then echo 1; else echo 0; fi # => 1 Tenga en cuenta que no necesita escapar de las barras inclinadas en este caso ya que / no son delimitadores de expresiones regulares aquí (en los comandos sed , debe escapar / si / se usa como un carácter delimitador de expresiones regulares).
En caso de que no le importe qué carácter aparece entre puts/push/ y /request , simplemente use la coincidencia global:
if [[ "$Targetpath" == puts/push/*/request ]]; then echo 1; else echo 0; fi Tenga en cuenta el operador == y * que coincide con cualquier texto. Sin embargo, tenga en cuenta que los patrones globales coinciden con todo el texto/cadena, por lo que es posible que también necesite * en ambos extremos.
Como comenté, este requisito no necesita expresiones regulares. Se puede hacer completamente en glob (o extglob ):
Caso 1: si solo desea validar la parte inicial y final, use:
[[ $Targetpath == puts/push/*/request ]]Caso 2: si desea validar la parte inicial y final y permitir solo dígitos en la parte central:
# enable extended glob shopt -s extglob [[ $Targetpath == puts/push/+([[:digit:]])/request ]] Caso 3: si desea validar la parte inicial y final y permitir solo 1+ de cualquier carácter que no sea / en la parte central:
# enable extended glob shopt -s extglob [[ $Targetpath == puts/push/+([!/])/request ]]