J'ai une variable var
dans un script Bash contenant une chaîne, comme:
echo $var
"some string.rtf"
Je souhaite supprimer les 4 derniers caractères de cette chaîne et affecter le résultat à une nouvelle variable var2
, de sorte que
echo $var2
"some string"
Comment puis-je faire ceci?
Réponses:
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 utiliservar2=${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 utiliservar2=${var%.*}
. Si vous ne voulez que tout garder jusqu'au premier.
, vous pouvez utiliservar2=${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, utilisez
var2=${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 de4
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.la source
Vous pouvez faire comme ça:
la source
bash
4+, mais dans la version précédente, vous pouvez utiliser le légèrement plus long${v::${#v}-4}
.${v::-4}
croaks "zsh: accolade fermante attendue". Mais la réponse de @fredtantini ci-dessous${v:0:-4}
fonctionne très bien.Pour supprimer quatre caractères de la fin de la chaîne, utilisez
${var%????}
.Pour tout supprimer après la dernière
.
utilisation${var%.*}
.la source
${var#????}
pour cela.Ce qui a fonctionné pour moi, c'est:
Mais je l'ai utilisé pour découper des lignes dans un fichier, c'est pourquoi cela semble gênant. La véritable utilisation était:
cut
vous permet uniquement de rogner à partir d'une position de départ, ce qui est mauvais si vous avez besoin de lignes de longueur variable. Donc, cette solution inverse (rev
) la chaîne et maintenant nous nous rapportons à sa position de fin, puis utilisecut
comme mentionné, et la retourne (encore une foisrev
) à son ordre d'origine.la source
rev
inverse les lignes, pas les chaînes.echo $SOME_VAR | rev | ...
ne se comportera probablement pas comme on pourrait s'y attendre.Utilisation de l' extension variable / remplacement de sous-chaîne :
Vous pouvez donc faire:
Alternativement,
Si vous avez toujours les mêmes 4 lettres
Si cela se termine toujours par
.xyz
:Vous pouvez également utiliser la longueur de la chaîne:
ou simplement
echo ${var::-4}
la source
len=${#var}; echo ${var::len-4}
pourrait être raccourci àecho ${var:0:-4}
:-) EDIT: ou comme l'a souligné @iyonizer, justeecho ${var::-4}
...Vous pouvez utiliser sed,
Exemple:
la source
var2
?J'ai essayé ce qui suit et cela a fonctionné pour moi:
Production:
hel
la source
J'espère que l'exemple ci-dessous vous aidera,
echo ${name:0:$((${#name}-10))}
->${name:start:len}
start
est le point de départ de la chaînelen
est la longueur de la chaîne à supprimer.Exemple:
Production:
Remarque: Bash 4.2 a ajouté la prise en charge de la sous-chaîne négative
la source
Cela a fonctionné pour moi en calculant la taille de la chaîne.
Il est facile de répéter la valeur que vous devez renvoyer, puis de la stocker comme ci-dessous
la source
Dans ce cas, vous pouvez utiliser le nom de base en supposant que vous ayez le même suffixe sur les fichiers que vous souhaitez supprimer.
Exemple:
Si vous ne connaissez pas le suffixe et souhaitez qu'il supprime tout après et y compris le dernier point:
% signifie couper,. est ce que vous coupez, * est un caractère générique
la source