Bash dernier indice de
Désolé pour le boiteux bash question, mais je ne peux pas semblent être en mesure de s'en sortir.
J'ai le texte suivant cas simple:
-
J'ai variables comme
artifact-1.2.3.zip
-
Je voudrais obtenir une sous-chaîne entre le tiret et le dernier indice de la dot (à la fois exclusif).
Mon bash compétences ne sont pas trop fort. J'ai le texte suivant:
a="artifact-1.2.3.zip"; b="-"; echo ${a:$(( $(expr index "$a" "$b" + 1) - $(expr length "$b") ))}
Production:
1.2.3.zip
Comment puis-je supprimer le .zip
partie?
OriginalL'auteur carlspring | 2013-04-22
Vous devez vous connecter pour publier un commentaire.
‘
#
modèle’ supprime modèle tant qu'il correspond à la début de$a
.La syntaxe de modèle est similaire à celui utilisé dans le nom de fichier correspondant.
Dans notre cas,
*
est une séquence de caractères.-
signifie littéralement le tableau de bord.#*-
correspond tout jusqu'à, et y compris, la première tableau de bord.${a#*- }
étend à tout ce$a
afficherait,sauf que
artifact-
est retiré de l'expansion,nous laissant avec
1.2.3.zip
.De même, "
%
modèle’ supprime modèle tant qu'il correspond à la fin de l'expansion.Dans notre cas,
.
un littéral dot.*
n'importe quelle séquence de caractères.%.*
est tout, y compris la dernier point jusqu'à la fin de la chaîne.$a
étend à1.2.3.zip
,puis
${a%.*}
étend à1.2.3
.Travail.
L'homme le contenu de la page est la suivante (au moins sur ma machine, YMMV):
HTH!
MODIFIER
Bravo à @x4d pour la réponse détaillée.
Toujours pense que les gens devraient RTFM.
Si ils ne comprennent pas le manuel,
puis après une autre question.
Aucune explication ou des documents connexes énumérés ici serait le mieux.
RTFM. Pour être juste, la page de man est très grand. Regardez pendant deux périodes consécutives de hachages dans ce fichier, et vous serez dans la zone de droite (
/##
commande dans moins)"RTFM" n'est pas dans l'esprit de la SORTE. Les réponses devraient être organisée et complète, citant la partie pertinente du manuel si nécessaire.
Bravo à @k4d pour la réponse détaillée. Toujours pense que les gens devraient RTFM. Si ils ne comprennent pas le manuel, puis après une autre question.
OriginalL'auteur bobbogo
La
bash
page de manuel de la section intitulée "la Substitution de Variable" décrit à l'aide de${var#pattern}
,${var##pattern}
,${var%pattern}
, et${var%%pattern}
.En supposant que vous avez une variable appelée
filename
, par exemple,ensuite, les éléments suivants sont basées sur des motifs extractions:
Pourquoi n'ai-je utiliser
##
au lieu de#
?Si le nom de fichier pourrait contenir des tirets à l'intérieur, tels que:
puis de comparer les deux substitutions suivantes:
Une fois extraites de la version et de la vulgarisation, de l'isoler de la version:
OriginalL'auteur aks
Bash RegEx fonctionnalité:
OriginalL'auteur anubhava
Je pense que vous pouvez le faire:
La dernière étape supprime les 4 derniers caractères de la chaîne. Il y a un peu plus d'info sur ici.
Merci, pas de problème, c'est pas une solution portable, mais je tiens à garder les choses simples :). Bobbogo la solution est le chemin à parcourir.
OriginalL'auteur James