Beaucoup de solutions à stackoverflow.com/questions/2264428/… aussi. D'un simple coup d'œil, la plupart des gens semblent être également couverts ici.
pbhj
Réponses:
59
Si la chaîne est déjà stockée dans une variable, vous pouvez utiliser bashle développement de paramètres, spécifiquement ${parameter,,pattern}(disponible depuis bash 4.0), où parameterest le nom de votre variable et patternest omis:
Si vous utilisez zsh, vous pouvez utiliser les drapeaux d’expansion de paramètres ( ${(FLAGS)NAME}disponibles depuis zsh 2.5) pour obtenir les mêmes résultats. La bashsyntaxe ne fonctionne pas dans zsh1) . Le drapeau pour les minuscules est L; pour les majuscules c'est U:
La ${string,,}notation n'existe que pour bash version 4+. Sinon, une des autres solutions est requise, telle que $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant
40
Très peu de méthodes fonctionnent correctement avec Unicode:
GNU sed 4.2.2 fonctionne :
$ echo "Idą gęsi łąką"| sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ
Sur Ubuntu 13.04, j'ai gawkAwk par défaut (comme indiqué avec update-alternatives --display awk). Êtes-vous sûr que mawkla valeur par défaut est 13.10?
Kiri
seds depuis 1990 ont soutenu l’ \Uoption ;-). Pas une caractéristique spécifique de Gnu-sed. Sinon, bonne réponse, tellement d'options, donc peu de temps ;-) Bonne chance à tous!
Dans votre exemple, le sac à main ucne fonctionne pas en Perl car vous devez le faire use Encodeou use utf8. Réécrivez votre exemple au fur echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'et à mesure et cela fonctionnera. Voir aussi stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy le
20
J'utiliserais la commande interne typet ou declare de bash pour définir une variable minuscule.
Les caractères sont réduits lorsque la valeur est définie, pas lorsque vous composez la variable. Il est donc préférable de composer au début du script. En majuscule, vous pouvez composer -u .
Ce n'est pas spécifique au shell bash, cela fonctionne aussi sur ksh, peut-être dans la définition du shell POSIX.
EDIT: Beaucoup de gens m'ont gentiment pointé le fait que la composition est maintenant considérée comme obsolète sur bash et remplacée par declare . Les deux commandes sont équivalentes.
$ help typeset
typeset: typeset [-aAfFgilrtux][-p] name[=value]...Set variable values and attributes.Obsolete.See`help declare'.
$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
Set variable values and attributes.
J'utilise moi-même toujours la syntaxe de composition en travaillant dans un environnement hétérogène, je ne dois donc pas réécrire mes scripts.
+1 Incroyable, je ne l'ai jamais su! BTW quelques informations supplémentaires: Je regardais ce dans le manuel et il semble que typesetest considéré comme depricated et remplacé pardeclare
thom
1
@thom merci, il semblerait que bash ait commencé à avoir une vie loin de ses "racines d'enveloppe" :)
Réponses:
Si la chaîne est déjà stockée dans une variable, vous pouvez utiliser
bash
le développement de paramètres, spécifiquement${parameter,,pattern}
(disponible depuis bash 4.0), oùparameter
est le nom de votre variable etpattern
est omis:Notez que cela ne change pas la valeur de la variable, mais uniquement la sortie. Pour changer la variable, vous devez attribuer la nouvelle valeur:
La conversion en majuscule fonctionne avec
${parameter^^pattern}
:Cela fonctionne aussi avec les chaînes Unicode (au moins avec les versions actuelles de bash, nécessite probablement au moins bash 4.3):
Si vous utilisez
zsh
, vous pouvez utiliser les drapeaux d’expansion de paramètres (${(FLAGS)NAME}
disponibles depuis zsh 2.5) pour obtenir les mêmes résultats. Labash
syntaxe ne fonctionne pas danszsh
1) . Le drapeau pour les minuscules estL
; pour les majuscules c'estU
:Cela fonctionne aussi avec les chaînes Unicode (au moins depuis zsh 5.0; je n'ai pas essayé avec les versions précédentes):
1) Bien que, vu que zsh l’ait depuis beaucoup plus longtemps, il devrait probablement être: "la
zsh
syntaxe ne fonctionne pas dansbash
.la source
${string,,}
notation n'existe que pour bash version 4+. Sinon, une des autres solutions est requise, telle que$(echo $string | tr '[:upper:]' '[:lower:]')
.Très peu de méthodes fonctionnent correctement avec Unicode:
GNU sed 4.2.2 fonctionne :
bash 4.2.45 declare ne fonctionne pas :
L’extension du paramètre bash 4.2.45 ne fonctionne pas :
bash 4.3.42
declare
et travaux d’ extension des paramètres :GNU tr 8.20 ne fonctionne pas :
mawk (awk par défaut dans Ubuntu 13.10) ne fonctionne pas :
gawk fonctionne :
Perl pure uc () ne fonctionne pas :
Python 2 sans indication Unicode ne fonctionne pas :
Python 2 lorsqu'il est demandé de traiter avec Unicode fonctionne :
Python 3 fonctionne :
la source
gawk
Awk par défaut (comme indiqué avecupdate-alternatives --display awk
). Êtes-vous sûr quemawk
la valeur par défaut est 13.10?sed
s depuis 1990 ont soutenu l’\U
option ;-). Pas une caractéristique spécifique de Gnu-sed. Sinon, bonne réponse, tellement d'options, donc peu de temps ;-) Bonne chance à tous!uc
ne fonctionne pas en Perl car vous devez le faireuse Encode
ouuse utf8
. Réécrivez votre exemple au furecho "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
et à mesure et cela fonctionnera. Voir aussi stackoverflow.com/a/13261662/3701431J'utiliserais la commande interne typet ou declare de bash pour définir une variable minuscule.
Les caractères sont réduits lorsque la valeur est définie, pas lorsque vous composez la variable. Il est donc préférable de composer au début du script. En majuscule, vous pouvez composer -u .
Ce n'est pas spécifique au shell bash, cela fonctionne aussi sur ksh, peut-être dans la définition du shell POSIX.
EDIT: Beaucoup de gens m'ont gentiment pointé le fait que la composition est maintenant considérée comme obsolète sur bash et remplacée par declare . Les deux commandes sont équivalentes.
J'utilise moi-même toujours la syntaxe de composition en travaillant dans un environnement hétérogène, je ne dois donc pas réécrire mes scripts.
la source
typeset
est considéré comme depricated et remplacé pardeclare
Vous pouvez le faire avec la
tr
commande.Dans le terminal ( Ctrl+ Alt+ T)
Cette commande:
convertira les minuscules en majuscules.
convertira les majuscules en minuscules.
Exemple:
Le crédit va à la cybercité
la source
tr A-Z a-z
cela fonctionnera aussi.Vous pouvez
sed
aussi faire passer des choses :Et
\L
aura l'effet inverse:la source
Ce n'est pas une solution pure bash, mais vous pouvez faire passer vos chaînes
perl
(comme Oli l'a fait avecsed
):Et
\L
aura l'effet inverse:la source
Utilisez cette commande simple Pour les majuscules aux minuscules Où 'f' est le nom du fichier où vous souhaitez effectuer la conversion.
Pour minuscule à majuscule
la source