Ben bash ile benim dize sadece ilk karakteri büyük harfle istiyorum.
foo="bar";
//uppercase first character
echo $foo;
"Bar" yazmalıdır;
Ben bash ile benim dize sadece ilk karakteri büyük harfle istiyorum.
foo="bar";
//uppercase first character
echo $foo;
"Bar" yazmalıdır;
Yanıtlar:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCameliçine NotQuiteCamel. Varyantınızın yan etkisi vardır veya kalanları küçük harflere zorlar - alt kabukların ve tr işlemlerinin sayısını iki katına çıkarmak.
bash.
Bash ile tek yön (sürüm 4+):
foo=bar
echo "${foo^}"
baskılar:
Bar
"${foo,}". Tüm harfleri küçük harf yapmak için tuşunu kullanın "${foo,,}". Tüm harfleri büyük harf yapmak için tuşunu kullanın "${foo^^}".
${foo~}ve ${foo~~}aynı etkiye sahip ${foo^}ve ${foo^^}. Ama hiçbir yerde bahsettiğim alternatifi hiç görmedim.
bad substitution
Şununla tek yön sed:
echo "$(echo "$foo" | sed 's/.*/\u&/')"
Baskılar:
Bar
brew install coreutils gnu-sedve önek olmadan komutları kullanmak için talimatları izleyin g. Ne kadar değerli olursa olsun, GNU sürümlerini aldığından beri bu komutların OSX sürümünü asla çalıştırmak istemedim.
sedbu durumda GNU'ya ihtiyacınız olacak
sed 's/./\U&/ve POSIX sed üzerinde çalışacaktır.
$ foo="bar";
$ foo=`echo ${foo:0:1} | tr '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar
İşte "yerel" metin araçları yolu:
#!/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:]olmayan harfleri içeren dil / yerel ayarlarda çalışması gerekiyorsa daha iyi bir seçimdir . a-zA-Z
Yalnızca awk kullanma
foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
Saf bash'da bash-3.2 ile de yapılabilir:
# 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 = $1ama sadece -bash: foo: command not found
=ödevlerin etrafında boşluk yok . Bu, shellcheck.net'in sizin için programlama yoluyla bulacağı bir şeydir .
=, bir programa argüman olarak geçemezdiniz ( someprogram =çalışıp çalışmadığını someprogramveya adlı bir değişkene atanıp atanmadığını nasıl bilebilir someprogram?)
Bu da işe yarıyor ...
FooBar=baz
echo ${FooBar^^${FooBar:0:1}}
=> Baz
FooBar=baz
echo ${FooBar^^${FooBar:1:1}}
=> bAz
FooBar=baz
echo ${FooBar^^${FooBar:2:2}}
=> baZ
Ve bunun gibi.
Kaynaklar:
Inroductions / Öğreticiler:
Yalnızca ilk kelimeyi büyük harf yapmak için:
foo='one two three'
foo="${foo^}"
echo $foo
O iki iki
Değişkendeki her kelimeyi büyük harf yapmak için:
foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
O ne T wo T hree
(bash 4+ ile çalışır)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done) Her sözcük için daha kısa çözünürlük. foo Şimdi "Bir İki Üç"
Hem Linux hem de OSX için alternatif ve temiz çözüm, bash değişkenleriyle de kullanılabilir
python -c "print(\"abc\".capitalize())"
Abc döndürür
Bu benim için çalıştı:
Geçerli dizindeki tüm * php dosyalarını arama ve her dosya adının ilk karakterini büyük harfe değiştirme:
örneğin: test.php => Test.php
for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done
sadece burada eğlenmek için:
foo="bar";
echo $foo | awk '{$1=toupper(substr($1,0,1))substr($1,2)}1'
# or
echo ${foo^}
# or
echo $foo | head -c 1 | tr [a-z] [A-Z]; echo $foo | tail -c +2
# or
echo ${foo:1} | sed -e 's/^./\B&/'
Tam olarak ne istediğini değil, oldukça yararlı
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.
foo=bar
echo $foo
BAR
Ve tam tersi
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
}
ilk harf-küçük-düşük-xc () {v-ilk harf-küçük | xclip -seçim panosu}
İlk karakter bir harf değilse (sekme, boşluk ve çıkış karakterli çift tırnak) olursa ne olur ? Bir mektup bulana kadar test etsek iyi olur ! Yani:
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=
$[...]) kullanıyorsunuz. Çok işe yaramaz parantez kullanıyorsunuz. Dizenin latin alfabesindeki karakterlerden oluştuğunu varsayıyorsunuz (aksanlı harfler veya diğer alfabe harfleri ne olacak?). Bu pasajı kullanılabilir hale getirmek için çok işin var! (ve normal ifadeyi kullandığınız için, döngü yerine ilk harfi bulmak için normal ifadeyi de kullanabilirsiniz).
tr:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foo duruma örnektir ; böylece sizin içeriğiniz , string-split ve glob-expanded. Bu örnek ve diğerleri için de aynı şekilde geçerlidir . Bkz BashPitfalls # 14 . echo ${F}Fecho ${S:$N:1}