Tengo una variable var
en un script Bash que contiene una cadena, como:
echo $var
"some string.rtf"
Quiero eliminar los últimos 4 caracteres de esta cadena y asignar el resultado a una nueva variable var2
, para que
echo $var2
"some string"
¿Cómo puedo hacer esto?
Respuestas:
Primero, debes ser explícito sobre lo que quieres. Si sabe que la cadena termina
.rtf
y desea eliminarla.rtf
, puede usarlavar2=${var%.rtf}
. Si no sabe cuál es el sufijo pero desea eliminar todo comenzando por el último.
, puede usarlovar2=${var%.*}
. Si solo desea mantener todo al principio.
, puede usarvar2=${var%%.*}
. Esas dos últimas opciones tienen el mismo resultado si solo hay un período, pero si puede haber más de uno, debe decidir cuál desea.Si realmente desea eliminar siempre un número exacto de caracteres, aquí hay algunas opciones.
Especificaste bash específicamente, así que comenzaremos con bash builtins. La que ha trabajado más tiempo es la misma sintaxis de eliminación de sufijos que utilicé anteriormente: para eliminar cuatro caracteres, use
var2=${var%????}
. Necesita un signo de interrogación por cada carácter eliminado, por lo que esto se vuelve difícil de manejar para longitudes de subcadena más grandes.Ligeramente más recientes es subcadena de extracción:
var2=${var::${#var}-4}
. Aquí puede colocar cualquier número en lugar de4
para eliminar un número diferente de caracteres. (El${#var}
se reemplaza por la longitud de la cadena, por lo que en realidad se trata de mantener los primeros caracteres (longitud - 4)).Las versiones más nuevas de bash (específicamente 4+, lo que significa que la que viene con MacOS no funcionará) le permiten simplificar eso para simplemente
var2=${var::-4}
.Si en realidad no está utilizando bash pero algún otro shell de tipo POSIX, la eliminación del sufijo seguirá funcionando, incluso en el tablero viejo (donde ninguno de los demás lo hará). En zsh, todos funcionan pero tienes que poner un punto
0
entre los dos puntos:var2=${var:0:-4}
etc. En ksh, necesitas el 0 y también debes usar la expresión explícita de longitud-4:var2=${var:0:${#var}-4}
.Por supuesto, puede usar la sustitución de comandos para hacerlo con la ayuda de un programa de utilidad; hay muchos que funcionarán, pero algo así
var2=$(cut -c -4 <<<"$var")
es probablemente la opción más corta.fuente
Puedes hacer así:
fuente
bash
4+, pero en la versión anterior puedes usar un poco más${v::${#v}-4}
.${v::-4}
croaks "zsh: cierre de llave esperado". Pero la respuesta de @fredtantini a continuación${v:0:-4}
funciona bien.Para eliminar cuatro caracteres del final de la cadena, use
${var%????}
.Para eliminar todo después del
.
uso final${var%.*}
.fuente
${var#????}
para eso.Lo que funcionó para mí fue:
Pero lo usé para recortar líneas en un archivo, por eso se ve incómodo. El uso real fue:
cut
solo lo lleva al recorte desde alguna posición inicial, lo cual es malo si necesita filas de longitud variable. Entonces, esta solución invierte (rev
) la cadena y ahora nos relacionamos con su posición final, luego usacut
como se mencionó, y la invierte (nuevamenterev
) a su orden original.fuente
rev
invierte líneas, no cadenas.echo $SOME_VAR | rev | ...
probablemente no se comportará como cabría esperar.Uso de reemplazo de expansión / subcadena variable :
Entonces puedes hacer:
Alternativamente,
Si siempre tienes las mismas 4 letras
Si siempre termina en
.xyz
:También puede usar la longitud de la cadena:
o simplemente
echo ${var::-4}
fuente
len=${#var}; echo ${var::len-4}
podría acortarse aecho ${var:0:-4}
:-) EDITAR: o como señaló @iyonizer, soloecho ${var::-4}
...Podrías usar sed,
Ejemplo:
fuente
var2
?Intenté lo siguiente y funcionó para mí:
Salida:
hel
fuente
Espero que el siguiente ejemplo ayude,
echo ${name:0:$((${#name}-10))}
->${name:start:len}
start
es el punto de partida de la cuerdalen
es la longitud de la cadena que debe eliminarse.Ejemplo:
Salida:
Nota: Bash 4.2 agregó soporte para subcadena negativa
fuente
Esto funcionó para mí calculando el tamaño de la cadena.
Es fácil que necesite hacer eco del valor que necesita devolver y luego almacenarlo como se muestra a continuación
fuente
En este caso, podría usar basename suponiendo que tiene el mismo sufijo en los archivos que desea eliminar.
Ejemplo:
Si no conoce el sufijo y desea que elimine todo después e incluyendo el último punto:
% significa cortar,. es lo que estás cortando, * es comodín
fuente