Ich möchte nur das erste Zeichen in meiner Zeichenfolge mit Bash in Großbuchstaben schreiben.
foo="bar";
//uppercase first character
echo $foo;
sollte "Bar" drucken;
Ich möchte nur das erste Zeichen in meiner Zeichenfolge mit Bash in Großbuchstaben schreiben.
foo="bar";
//uppercase first character
echo $foo;
sollte "Bar" drucken;
Antworten:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCamel
in NotQuiteCamel
. Ihre Variante hat den Nebeneffekt oder zwingt den Rest in Kleinbuchstaben - auf Kosten der Verdoppelung der Anzahl von Unterschalen und Tr-Prozessen.
bash
.
Ein Weg mit Bash (Version 4+):
foo=bar
echo "${foo^}"
Drucke:
Bar
"${foo,}"
. Verwenden Sie, um alle Buchstaben in Kleinbuchstaben zu schreiben "${foo,,}"
. Verwenden Sie, um alle Buchstaben in Großbuchstaben zu schreiben "${foo^^}"
.
${foo~}
und ${foo~~}
habe den gleichen Effekt wie ${foo^}
und ${foo^^}
. Aber ich habe diese Alternative nie erwähnt.
bad substitution
Ein Weg mit sed
:
echo "$(echo "$foo" | sed 's/.*/\u&/')"
Drucke:
Bar
brew install coreutils gnu-sed
und befolgen Sie die Anweisungen, um die Befehle ohne Präfix zu verwenden g
. Für das, was es wert ist, wollte ich die OSX-Version dieser Befehle seit dem Erhalt der GNU-Versionen nie mehr ausführen.
sed
in diesem Fall brauchen
sed 's/./\U&/
es einfach in und es wird auf POSIX sed funktionieren.
$ foo="bar";
$ foo=`echo ${foo:0:1} | tr '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar
Hier ist die "native" Art der Textwerkzeuge:
#!/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:]
ist eine bessere Wahl, wenn es in Sprachen / Gebietsschemas mit Buchstaben arbeiten muss, die nicht in den Bereichen a-z
oder A-Z
liegen.
Nur awk verwenden
foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
Es kann auch in reinem Bash mit Bash-3.2 durchgeführt werden:
# 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
aber ich bekomme nur-bash: foo: command not found
=
in Zuordnungen. Dies wird Shellcheck.net programmgesteuert für Sie finden.
=
als Argument an ein Programm übergeben (woher soll es wissen, ob someprogram =
es ausgeführt someprogram
wird oder einer Variablen mit dem Namen zugewiesen wird someprogram
?)
Das funktioniert auch ...
FooBar=baz
echo ${FooBar^^${FooBar:0:1}}
=> Baz
FooBar=baz
echo ${FooBar^^${FooBar:1:1}}
=> bAz
FooBar=baz
echo ${FooBar^^${FooBar:2:2}}
=> baZ
Und so weiter.
Quellen:
Einführungen / Tutorials:
Um nur das erste Wort groß zu schreiben:
foo='one two three'
foo="${foo^}"
echo $foo
O ne zwei drei
So schreiben Sie jedes Wort in der Variablen groß :
foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
O ne T wo T drei
(funktioniert in Bash 4+)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done)
Kürzere Auflösung für jedes Wort. foo Jetzt ist "Eins Zwei Drei"
Alternative und saubere Lösung für Linux und OSX, kann auch mit Bash-Variablen verwendet werden
python -c "print(\"abc\".capitalize())"
gibt Abc zurück
Dieser hat für mich gearbeitet:
Suchen Sie nach allen * PHP-Dateien im aktuellen Verzeichnis und ersetzen Sie das erste Zeichen jedes Dateinamens durch Großbuchstaben:
zB: test.php => Test.php
for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done
Nicht genau das, was gefragt wurde, aber sehr hilfreich
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.
foo=bar
echo $foo
BAR
Und das Gegenteil
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
}
erster Buchstabe zum unteren xc () {v-erster Buchstabe zum unteren | xclip -selection Zwischenablage}
Was ist, wenn das erste Zeichen kein Buchstabe ist (sondern ein Tabulator, ein Leerzeichen und ein maskiertes Anführungszeichen)? Wir sollten es besser testen , bis wir einen Brief finden! So:
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=
$[...]
). Sie verwenden viele nutzlose Klammern. Sie gehen davon aus, dass die Zeichenfolge aus Zeichen aus dem lateinischen Alphabet besteht (wie wäre es mit akzentuierten Buchstaben oder Buchstaben in anderen Alphabeten?). Sie haben viel Arbeit, um dieses Snippet nutzbar zu machen! (und da Sie Regex verwenden, können Sie auch den Regex verwenden, um den ersten Buchstaben anstelle einer Schleife zu finden).
tr
:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foo
ein Beispiel für eine Situation, in der der Parser eine Liste von Wörtern erwartet . In Ihrem Fall sind echo ${F}
die Inhalte von F
String-Split und Glob-Expanded. Das gilt auch für das echo ${S:$N:1}
Beispiel und den Rest. Siehe BashPitfalls # 14 .