Primero, debes ser explícito sobre lo que quieres. Si sabe que la cadena termina .rtf
y desea eliminarla .rtf
, puede usarla var2=${var%.rtf}
. Si no sabe cuál es el sufijo pero desea eliminar todo comenzando por el último .
, puede usarlo var2=${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, usevar2=${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 de 4
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.