Estoy tratando de escribir un script bash que contiene una función de modo que cuando dado un .tar
, .tar.bz2
, .tar.gz
archivo, etc. que utiliza el alquitrán con los interruptores pertinentes para descomprimir el archivo.
Estoy usando if elif y luego declaraciones que prueban el nombre de archivo para ver con qué termina y no puedo hacer que coincida con metacaracteres regex.
Para guardar la reescritura constante del script que estoy usando 'prueba' en la línea de comando, pensé que la siguiente declaración debería funcionar, he intentado todas las combinaciones de corchetes, citas y metacaracteres posibles y aún falla.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Estoy seguro de que el problema es simple y he buscado en todas partes, sin embargo, no puedo entender cómo hacerlo. ¿Alguien sabe cómo puedo hacer esto?
check="^a.*c$";if [[ "abc" =~ $check ]];then echo match;fi
tenemos que almacenar la expresión regular en una var[[ sed-4.2.2.tar.bz2 == "*tar.bz2" ]]
no funcionaría.[[ ! foo =~ bar ]]
.-n 1
parámetro, tampoco lo coloca automáticamente en una$REPLY
variable. ¡Cuidado!Una función para hacer esto
Otra nota
En respuesta a Aquarius Power en el comentario anterior,
We need to store the regex on a var
La variable BASH_REMATCH se establece después de que coincida con la expresión, y $ {BASH_REMATCH [n]} coincidirá con el enésimo grupo entre paréntesis, es decir, en el siguiente
${BASH_REMATCH[1]} = "compressed"
y${BASH_REMATCH[2]} = ".gz"
(La expresión regular anterior no está destinada a ser válida para nombres y extensiones de archivos, pero funciona para el ejemplo)
fuente
a
en GNU tar op
en BSD tar para indicarle explícitamente que infiera automáticamente el tipo de compresión de la extensión. GNU tar no lo hará automáticamente de lo contrario, y supongo por el comentario de @GoodPerson que BSD tar lo hace por defecto.No tengo suficiente representante para comentar aquí, así que estoy enviando una nueva respuesta para mejorar la respuesta de Dogbane. El punto . en la expresión regular
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
en realidad coincidirá con cualquier carácter, no solo el punto literal entre 'tar.bz2', por ejemplo
o cualquier cosa que no requiera escapar con '\'. La sintaxis estricta debería ser
o puede ir aún más estricto y también incluir el punto anterior en la expresión regular:
fuente
Como está utilizando bash, no necesita crear un proceso secundario para hacerlo. Aquí hay una solución que lo realiza completamente dentro de bash:
Explicación: El operador de coincidencia de patrones almacena los grupos antes y después de la secuencia "dos puntos y uno o más espacios" en la matriz BASH_REMATCH.
fuente
¡Funciona para mi!
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
fuente
[[ ... ]]
, el patrón global de rhs no se expande de acuerdo con el directorio actual, como lo haría normalmente.[[...]]
, Bash no realiza la expansión del nombre de archivo. En bash manual,Word splitting and filename expansion are not performed on the words between the [[ and ]];
shopt -s nocasematch
fuente