Tout d'abord, vous devez être explicite sur ce que vous voulez. Si vous savez que la chaîne se termine par .rtf
et que vous souhaitez supprimer le .rtf
, vous pouvez utiliser var2=${var%.rtf}
. Si vous ne savez pas quel est le suffixe mais que vous souhaitez supprimer tout ce qui commence par le dernier .
, vous pouvez utiliser var2=${var%.*}
. Si vous ne voulez que tout garder jusqu'au premier .
, vous pouvez utiliser var2=${var%%.*}
. Ces deux dernières options ont le même résultat s'il n'y a qu'une seule période, mais s'il peut y en avoir plus d'une, vous devez décider laquelle vous voulez.
Si vous voulez vraiment toujours supprimer un nombre exact de caractères, voici quelques options.
Vous avez spécifié bash spécifiquement, nous allons donc commencer avec les commandes bash. Celui qui a fonctionné le plus longtemps est la même syntaxe de suppression de suffixe que j'ai utilisée ci-dessus: pour supprimer quatre caractères, utilisezvar2=${var%????}
. Vous avez besoin d'un point d'interrogation par caractère supprimé, donc cela devient difficile à gérer pour des longueurs de sous-chaîne plus importantes.
Un peu plus récent est sousChaîne extraction: var2=${var::${#var}-4}
. Ici, vous pouvez mettre n'importe quel nombre à la place de 4
pour supprimer un nombre différent de caractères. (Le ${#var}
est remplacé par la longueur de la chaîne, donc cela demande en fait de conserver les premiers (longueur - 4) caractères.)
Les versions plus récentes de bash (en particulier 4+, ce qui signifie que celle livrée avec MacOS ne fonctionnera pas) vous permettent de simplifier var2=${var::-4}
.
Si vous n'utilisez pas bash mais un autre shell de type POSIX, la suppression du suffixe fonctionnera toujours, même dans un simple tiret ancien (où aucun des autres ne le fera). En zsh, ils fonctionnent tous mais vous devez mettre un 0
entre les deux points: var2=${var:0:-4}
etc. En ksh, vous avez besoin du 0 et vous devez également utiliser l'expression explicite de longueur 4:var2=${var:0:${#var}-4}
.
Vous pouvez bien sûr utiliser la substitution de commandes pour le faire à l'aide d'un programme utilitaire; il y en a beaucoup qui fonctionneront, mais quelque chose comme var2=$(cut -c -4 <<<"$var")
est probablement l'option la plus courte.