Je veux mettre en majuscule juste le premier caractère de ma chaîne avec bash.
foo="bar";
//uppercase first character
echo $foo;
devrait afficher "Bar";
Je veux mettre en majuscule juste le premier caractère de ma chaîne avec bash.
foo="bar";
//uppercase first character
echo $foo;
devrait afficher "Bar";
Réponses:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCamel
en NotQuiteCamel
. Votre variante a pour effet secondaire de forcer le reste en minuscules - au prix de doubler le nombre de sous-coquilles et de processus tr.
bash
.
Aller simple avec bash (version 4+):
foo=bar
echo "${foo^}"
imprime:
Bar
"${foo,}"
. Pour mettre toutes les lettres en minuscules, utilisez "${foo,,}"
. Pour mettre toutes les lettres en majuscules, utilisez "${foo^^}"
.
${foo~}
et ${foo~~}
j'ai le même effet que ${foo^}
et ${foo^^}
. Mais je n'ai jamais vu cette alternative mentionnée nulle part.
bad substitution
Aller simple avec sed
:
echo "$(echo "$foo" | sed 's/.*/\u&/')"
Impressions:
Bar
brew install coreutils gnu-sed
et suivez les instructions pour utiliser les commandes sans le préfixe g
. Pour ce que ça vaut, je n'ai jamais voulu exécuter la version OSX de ces commandes depuis l'obtention des versions GNU.
sed
dans ce cas
sed 's/./\U&/
et cela fonctionnera sur POSIX sed.
$ foo="bar";
$ foo=`echo ${foo:0:1} | tr '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar
Voici la méthode des outils de texte "natifs":
#!/bin/bash
string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second
tr [:lower:] [:upper:]
est un meilleur choix s'il doit fonctionner dans une langue / des paramètres régionaux incorporant des lettres qui ne sont pas dans les plages a-z
ou A-Z
.
Utiliser awk uniquement
foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
Cela peut également être fait en pure bash avec bash-3.2:
# First, get the first character.
fl=${foo:0:1}
# Safety check: it must be a letter :).
if [[ ${fl} == [a-z] ]]; then
# Now, obtain its octal value using printf (builtin).
ord=$(printf '%o' "'${fl}")
# Fun fact: [a-z] maps onto 0141..0172. [A-Z] is 0101..0132.
# We can use decimal '- 40' to get the expected result!
ord=$(( ord - 40 ))
# Finally, map the new value back to a character.
fl=$(printf '%b' '\'${ord})
fi
echo "${fl}${foo:1}"
foo = $1
mais je ne reçois que-bash: foo: command not found
=
affectations. C'est quelque chose que shellcheck.net trouvera pour vous par programme.
=
en argument à un programme (comment est-il censé savoir s'il someprogram =
est en cours d'exécution someprogram
, ou qu'il est assigné à une variable nommée someprogram
?)
Cela fonctionne aussi ...
FooBar=baz
echo ${FooBar^^${FooBar:0:1}}
=> Baz
FooBar=baz
echo ${FooBar^^${FooBar:1:1}}
=> bAz
FooBar=baz
echo ${FooBar^^${FooBar:2:2}}
=> baZ
Etc.
Sources:
Inroductions / Tutoriels:
Pour mettre en majuscule uniquement le premier mot:
foo='one two three'
foo="${foo^}"
echo $foo
O ne deux trois
Pour mettre en majuscule chaque mot de la variable:
foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
O ne T wo T ROIS
(fonctionne en bash 4+)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done)
Résolution plus courte pour chaque mot. foo Now est "One Two Three"
Solution alternative et propre pour Linux et OSX, elle peut également être utilisée avec des variables bash
python -c "print(\"abc\".capitalize())"
renvoie Abc
Celui-ci a fonctionné pour moi:
Recherche de tous les fichiers * php dans le répertoire courant, et remplacez le premier caractère de chaque nom de fichier par une majuscule:
par exemple: test.php => Test.php
for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done
juste pour le plaisir vous voilà:
foo="bar";
echo $foo | awk '{$1=toupper(substr($1,0,1))substr($1,2)}1'
# or
echo ${foo^}
# or
echo $foo | head -c 1 | tr [a-z] [A-Z]; echo $foo | tail -c +2
# or
echo ${foo:1} | sed -e 's/^./\B&/'
Pas exactement ce qui a été demandé mais assez utile
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.
foo=bar
echo $foo
BAR
Et le contraire
declare -l foo #When the variable is assigned a value, all upper-case characters are converted to lower-case.
foo=BAR
echo $foo
bar
first-letter-to-lower () {
str=""
space=" "
for i in $@
do
if [ -z $(echo $i | grep "the\|of\|with" ) ]
then
str=$str"$(echo ${i:0:1} | tr '[A-Z]' '[a-z]')${i:1}$space"
else
str=$str${i}$space
fi
done
echo $str
}
first-letter-to-upper-xc () {
v-first-letter-to-upper | xclip -selection clipboard
}
first-letter-to-upper () {
str=""
space=" "
for i in $@
do
if [ -z $(echo $i | grep "the\|of\|with" ) ]
then
str=$str"$(echo ${i:0:1} | tr '[a-z]' '[A-Z]')${i:1}$space"
else
str=$str${i}$space
fi
done
echo $str
}
first-letter-to-lower-xc () {v-first-letter-to-lower | presse-papiers de sélection xclip}
Que faire si le premier caractère n'est pas une lettre (mais une tabulation, un espace et un guillemet double échappé)? Nous ferions mieux de le tester jusqu'à ce que nous trouvions une lettre! Alors:
S=' \"ó foo bar\"'
N=0
until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done
#F=`echo ${S:$N:1} | tr [:lower:] [:upper:]`
#F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option
F=`echo ${S:$N:1}
F=`echo ${F} #pure Bash solution to "upper"
echo "$F"${S:(($N+1))} #without garbage
echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved
Foo bar
= \"Foo bar=
$[...]
). Vous utilisez beaucoup de parenthèses inutiles. Vous supposez que la chaîne se compose de caractères de l'alphabet latin (qu'en est-il des lettres accentuées ou des lettres d'autres alphabets?). Vous avez beaucoup de travail pour rendre cet extrait utilisable! (et puisque vous utilisez regex, vous pouvez aussi bien utiliser l'expression régulière pour trouver la première lettre, au lieu d'une boucle).
tr
:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foo
s'agit d'un exemple de situation où l'analyseur attend une liste de mots ; Ainsi, dans votre echo ${F}
, le contenu de F
est divisé en chaîne et étendu globalement. C'est également vrai pour l' echo ${S:$N:1}
exemple et tout le reste. Voir BashPitfalls # 14 .