majuscule le premier caractère dans une variable bash
Je veux en majuscules seulement le premier caractère dans mon string avec bash.
foo="bar";
//uppercase first character
echo $foo;
doit imprimer "de la Barre";
- Ce n'est pas une copie exacte, mais la plupart des techniques décrites dans la section la Conversion d'une chaîne en minuscules dans le shell Bash scripting peut également être appliquée à ce problème.
Vous devez vous connecter pour publier un commentaire.
notQuiteCamel
enNotQuiteCamel
. Votre variante a pour effet de bord ou en forçant le reste en minuscules, - au prix de doubler le nombre de sous les obus et tr processus.<<<
et de la chaîne de gamme, et ce n'est pas une bonne chose pour la portabilité des scripts.bash
.tr
est multi-octets capable. La GNU n'est-ce pas, mais BSD, Solaris et mac ostr
implémentations sont bien.Un avec bash (version 4+):
imprime:
"${foo,}"
. Minuscules, les lettres, l'utilisation"${foo,,}"
. Pour en majuscules toutes les lettres, utilisez"${foo^^}"
.foo
.${foo~}
et${foo~~}
ont le même effet que${foo^}
et${foo^^}
. Mais je n'ai jamais vu que l'alternative mentionnée nulle part.echo "${foo,,^}"
lc_foo="${foo,,}"; echo "${lc_foo^}"
bad substitution
bash --version
?echo "hello world" | perl -ne 'print ucfirst'
imprimeHello world
.Un avec
sed
:Imprime:
g
. Pour ce que ça vaut, je n'ai jamais voulu courir le OSX version de ces commandes depuis l'obtention de la licence GNU versions.sed
dans ce cassed 's/./\U&/
et il fonctionnera sur POSIX sed..*
permettra de convertir toutes les lettres, et pas seulement le premier.\u
sera conversion seul le premier caractère de la chaîne trouvée. Voir, par exemple, cette réponse pour un peu plus de détails.Ici est "indigènes", les outils de texte façon:
tr [:lower:] [:upper:]
est un meilleur choix si il a besoin de travailler dans la langue/locales intégrant les lettres qui ne sont pas dans lea-z
ouA-Z
plages.Utilisation de awk seulement
Il peut être fait dans le plus pur bash avec bash-3.2 ainsi:
foo = $1
mais je ne reçois-bash: foo: command not found
=
dans les affectations. C'est quelque chose que shellcheck.net trouvera pour vous par programmation.=
comme d'un argument à un programme (comment est-il censé savoir sisomeprogram =
est en cours d'exécutionsomeprogram
ou de l'affectation à une variable nomméesomeprogram
?)pour votre situation
pour chaque mot en majuscule en début
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done)
Plus courte de résolution pour chaque mot. foo Maintenant, est "Un Deux Trois"Cela fonctionne aussi...
Et ainsi de suite.
Sources:
Inroductions/Tutoriels:
Cette une a fonctionné pour moi:
À la recherche de tous *les fichiers php dans le répertoire courant , et de remplacer le premier caractère de chaque nom de fichier pour la lettre majuscule:
e.g: test.php => Test.php
Alternative et propre solution à la fois pour Linux et OSX, il peut également être utilisé avec des variables bash
retourne Abc
juste pour le fun vous êtes ici :
premier-lettre-de-basse-xc(){
v-premier-lettre-de-bas | xclip -sélection du presse-papiers
}
Si le premier caractère n'est pas une lettre (mais un onglet, un espace, et une échappé à double quote)? Nous ferions mieux de test il jusqu'à nous trouvons une lettre! Donc:
$[...]
). Vous utilisez beaucoup de parenthèses inutiles. Vous êtes en supposant que la chaîne se compose des caractères de l'alphabet latin (comment faire accentuée des lettres, ou des lettres dans les alphabets autres?). Vous avez beaucoup de travail à faire pour rendre cet extrait utilisable! (et puisque vous êtes en utilisant les regex, vous pourriez aussi bien utiliser les regex pour trouver la première lettre, au lieu d'une boucle).if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]])(.*) ]]; then out=${BASH_REMATCH[1]}$(tr '[[:lower:]]' '[[:upper:]]' <<<"${BASH_REMATCH[2]}")${BASH_REMATCH[3]}; else out=$S; fi; printf '%s\n' "$out"
tr
:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foo
est un exemple d'une situation où l'analyseur attend une liste de mots; donc, dans votreecho ${F}
, le contenu deF
sont de chaîne-split et glob-élargi. C'est même vrai pour lesecho ${S:$N:1}
exemple et tout le reste. Voir BashPitfalls #14.N=$[$N+1]
n'est pas seulement une figure de style choix et ce, sans impact fonctionnel: C'est en fait moins portable que l'POSIX standardisésN=$((N+1))
syntaxe qui la remplace, comme c'est une exclusion à partir des années 1970, de l'époque de la Bourne qui n'a pas été ajoutés dans les années 1990, de l'époque de la norme POSIX et n'est pas garanti d'être présents dans les temps modernes POSIX à base de coquilles).