Existe-t-il un moyen de mettre en majuscule / minuscule un seul caractère dans une chaîne?
Exemple d'entrée:
syslog_apr_24_30
syslog_mar_01_17
Sortie désirée:
syslog_Apr_24_30
syslog_Mar_01_17
Veuillez noter le début du mois en majuscules.
J'ai essayé awk
mais je ne suis pas assez bon pour le faire fonctionner.
sed 's/_./\U&/'
awk:
la source
Awk
version avec sous-chaînes et toupperExemple d'exécution:
la source
En utilisant
awk
:ou
Exemple
la source
Voici une approche Perl:
Le
-p
fait imprimer chaque ligne après avoir appliqué le script donné par-e
. La substitution remplace la première instance de_
et le caractère qui la suit par eux-mêmes ($&
est tout ce qui a été apparié) en haut de casse (uc()
),e
à la fin de l'opérateur de substitution (s///e
) est nécessaire afin d'évaluer les expressions.la source
Un autre
perl
:la source
Pure Bash 4.x, en utilisant une expression régulière pour sélectionner la partie que vous souhaitez upcase, et l'
^^
opérateur upcase sur cette partie. Agrafage à l'avant et à l'arrière (assorti par. *) Pour recréer la chaîne entière:Si vous ne vous souvenez pas de toutes les règles de citation, il est sûr de tout citer sauf l'expression régulière (qui ferait
=~
une correspondance de chaîne littérale).L'
^
opérateur upcase-first ne fonctionne qu'au début d'une variable (ou d'un élément de tableau). Et il ne semble pas y avoir d'expansion de sous-chaîne qui vous donne ce que perl appellerait une valeur l (que vous pouvez attribuer à / modifier). Les opérateurs up / downcase-first peuvent prendre un modèle qui est apparié sur une base par caractère, mais cela n'aide pas à sautersyslog_
, car il y a des noms de mois qui commencent par des caractères dans "syslog".Quoi qu'il en soit, cela pourrait être plus rapide que
foo="$(echo "$foo" | sed 's/_./\U&/')"
(publié en tant que commentaire de la réponse acceptée, par Glenn Jackman).Bash, sed ou awk sera BEAUCOUP plus rapide que perl. Si vous commencez à trouver plusieurs lignes simples perl utiles dans un script shell, vous devez simplement écrire le tout en perl.
la source
Si le mois suit toujours le premier "_" (trait de soulignement), utilisez-le (comme indiqué dans les autres réponses):
S'il peut y avoir d'autres soulignements avant celui qui précède le mois, alors ce qui précède ne fonctionnera pas.
Si le mois commence toujours par le 8ème caractère, alors utilisez ceci:
la source