2010-10-06 16 views
9

J'essaie de capitaliser la première lettre dans un fichier CSV qui est triée comme ceci:BASH - Faire la première Lettre Majuscule

A23; asd23; sdg3

Ce que je veux est une sortie comme ce

A23; Asd23; Sdg3

la première chaîne doit être tel quel, mais les deuxième et troisième devraient avoir une première lettre en majuscule. J'ai essayé avec AWK et SED mais je n'ai pas trouvé la bonne solution. Quelqu'un peut-il aider?

+0

Merci à tous. La réponse de Bart Sas correspond parfaitement à mes besoins. :-) – fwaechter

Répondre

17

Juste capitilise toutes les lettres qui suivent un point-virgule:

sed -e 's/;./\U&\E/g' 
+0

Merci. C'était exactement ce que j'ai cherché. :-) – fwaechter

+2

'\ E' n'est pas nécessaire. – kev

+1

Certaines explications sont dans l'ordre, puisque les regexes dans 'sed' ont leurs propres caractéristiques spéciales. '\ U' convertit tous les caractères à droite en majuscules,' & 'est (probablement) identique à' \ 0', '\ E' arrête inutilement la conversion. Voici un lien une autre réponse qui l'explique: http://stackoverflow.com/a/2762997/521032 – Septagram

1
echo "a23;asd23;sdg3" | perl -ne 's/(?<=\W)(\w)/ uc($1) /gex;print $_' 

a23;Asd23;Sdg3 
7

Bash (version 4 et plus) a un opérateur "premier majuscule", ${var^}, mais dans ce cas je pense qu'il vaut mieux utiliser sed:

sed -r 's/(^|;)(.)/\1\U\2/g' <<< "a23;asd23;sdg3" 
+1

Merci d'avoir mentionné le '$ {var ^}', ça a fait l'affaire pour moi! – lfxgroove

1
$ var="a23;asd23;sdg3" 
$ echo $var | awk -F";" '{for(i=2;i<=NF;i++) $i=toupper(substr($i,i,1))substr($i,1) }1' OFS=";" 
a23;Sasd23;Gsdg3