2010-10-06 9 views
9

Ich versuche, den ersten Buchstaben in einer CSV-Kapital, die wie folgt sortiert:BASH - Sprechen Sie die erste Brief Versalien-

a23; asd23; sdg3

Was ich will, ist eine Ausgabe wie diese

a23; Asd23; Sdg3

So sollte der erste String sein so wie es ist, aber der zweite und der dritte sollten einen großgeschriebenen ersten Buchstaben haben. Ich habe es mit AWK und SED versucht, aber ich habe nicht die richtige Lösung gefunden. Kann jemand helfen?

+0

Vielen Dank. Bart Sas Antwort passt perfekt zu meinen Bedürfnissen. :-) – fwaechter

Antwort

17

capitilise einfach alle Buchstaben, die ein Semikolon folgen:

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

Danke. Genau das habe ich gesucht. :-) – fwaechter

+2

'\ E' wird nicht benötigt. – kev

+1

Einige Erklärungen sind in Ordnung, da Regexes in 'sed' eigene Besonderheiten haben. '\ U' konvertiert alle Zeichen nach rechts in Großbuchstaben,' & 'ist (wahrscheinlich) dasselbe wie' \ 0', '\ E' stoppt die Konvertierung unnötig. Hier ist ein Link eine andere Antwort, die es erklärt: 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 und höher) hat einen "erstes Groß" Operator, ${var^}, aber in diesem Fall, dass ich denke, dass es besser ist, sed verwenden:

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

Danke für die Erwähnung der '$ {var ^}', hat es den Trick für mich! – 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