Secuencia de cultivos en Bash

Supongamos que tengo una cadena en mi variable de la siguiente manera.

var="/fnxn/ngfdg/abc.ext" 

Puedo get la raíz de esta variable (eliminar la extensión. *) De la siguiente manera

 echo ${var%.*} 

Puedo get la queue de esta variable (eliminando la ruta * /) de la siguiente manera

 echo ${var##*/} 

Pero ahora tengo que eliminar tanto la ruta como la extensión. Puedo hacerlo en dos pasos usando otra variable de la siguiente manera.

 var2=${var##*/} var3=${var2%.*} 

Pero la opción de un solo paso (similar a la syntax de zsh a continuación) muestra un post de error "sustitución incorrecta" en bash.

 echo ${${var##*/}%.*} 

Sería útil si obtengo una opción comprensible de un solo paso para networkingucir la longitud del código y evitar variables de entorno adicionales.

Si tiene una extensión fija, el basename POSIX admite exactamente el recorte que está intentando:

 basename "$var" .ext 

Si no lo hace, la expansión de zsh admite exactamente lo que está intentando:

Si se usa una expresión de parámetro de tipo $ {…} o una sustitución de command de tipo $ (…) en lugar del nombre anterior, primero se expande y el resultado se usa como si fuera el valor del nombre. Por lo tanto, es posible realizar operaciones anidadas: $ {$ {foo # head}% tail} sustituye el valor de $ foo con tanto 'head' como 'tail' eliminados.

Entonces en zsh

 echo ${${var##*/}%.*} 

hará lo que esperabas


Si estás comprometido con Bash, y quieres save líneas, podrías usar sed:

 sed -e 's/\.[^.]*$//' <<<"${var##*/}" 

Eso es solo un reemploop de expresión regular de todo después de la última . sin nada, después de perder el prefijo de la misma manera que ahora. Sin embargo, no creo que esto ahorre memory en la versión de dos líneas, y probablemente sea less comprensible.

Tenga en count que no hay ninguna razón por la que no pueda usar la misma variable durante todo el process:

 var2=${var##*/} var2=${var2%.*} 

La expansión ocurre antes de la asignación, así que esto es seguro. Si su preocupación es que un nombre de file realmente largo se almacene dos veces, eso no sucederá ahora, pero no creo que sea un problema realist.