Saya ingin huruf besar hanya karakter pertama di string saya dengan bash.
foo="bar";
//uppercase first character
echo $foo;
harus mencetak "Bar";
Saya ingin huruf besar hanya karakter pertama di string saya dengan bash.
foo="bar";
//uppercase first character
echo $foo;
harus mencetak "Bar";
Jawaban:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCamelmenjadi NotQuiteCamel. Varian Anda memiliki efek samping atau memaksa sisanya menjadi huruf kecil - dengan biaya menggandakan jumlah subkulit dan proses tr.
bash.
Satu arah dengan bash (versi 4+):
foo=bar
echo "${foo^}"
cetakan:
Bar
"${foo,}". Untuk huruf kecil semua huruf, gunakan "${foo,,}". Untuk huruf besar semua huruf, gunakan "${foo^^}".
${foo~}dan ${foo~~}memiliki efek yang sama seperti ${foo^}dan ${foo^^}. Tetapi saya tidak pernah melihat alternatif itu disebutkan di mana pun.
bad substitution
Satu cara dengan sed:
echo "$(echo "$foo" | sed 's/.*/\u&/')"
Cetakan:
Bar
brew install coreutils gnu-seddan ikuti instruksi untuk menggunakan perintah tanpa awalan g. Untuk apa nilainya saya tidak pernah ingin menjalankan versi OSX dari perintah ini sejak mendapatkan versi GNU.
seddalam hal ini
sed 's/./\U&/dan akan berfungsi pada POSIX sed.
$ foo="bar";
$ foo=`echo ${foo:0:1} | tr '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar
Berikut ini cara alat teks "asli":
#!/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:]adalah pilihan yang lebih baik jika perlu bekerja dalam bahasa / lokal memasukkan huruf yang tidak ada dalam a-zatau A-Zrentang.
Hanya menggunakan awk
foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
Ini dapat dilakukan dalam bash murni dengan bash-3.2 juga:
# 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 = $1tetapi saya hanya mendapatkan-bash: foo: command not found
=tugas dalam. Ini adalah sesuatu yang shellcheck.net akan temukan untuk Anda secara terprogram .
=sebagai argumen untuk program (bagaimana cara seharusnya tahu jika someprogram =sedang berjalan someprogram, atau menugaskan ke variabel bernama someprogram?)
Ini juga berfungsi ...
FooBar=baz
echo ${FooBar^^${FooBar:0:1}}
=> Baz
FooBar=baz
echo ${FooBar^^${FooBar:1:1}}
=> bAz
FooBar=baz
echo ${FooBar^^${FooBar:2:2}}
=> baZ
Dan seterusnya.
Sumber:
Pengenalan / Tutorial:
Hanya menggunakan huruf kapital untuk kata pertama:
foo='one two three'
foo="${foo^}"
echo $foo
O ne dua tiga
Untuk mengkapitalisasi setiap kata dalam variabel:
foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
O ne T wo T hree
(bekerja di bash 4+)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done) Resolusi lebih pendek untuk setiap kata. foo Sekarang adalah "One Two Three"
Alternatif dan solusi bersih untuk Linux dan OSX, dapat juga digunakan dengan variabel bash
python -c "print(\"abc\".capitalize())"
mengembalikan Abc
Yang ini bekerja untuk saya:
Mencari semua * file php di direktori saat ini, dan ganti karakter pertama dari setiap nama file dengan huruf kapital:
misal: test.php => Test.php
for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done
hanya untuk bersenang-senang di sini Anda berada:
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&/'
Tidak persis apa yang diminta tetapi sangat membantu
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.
foo=bar
echo $foo
BAR
Dan sebaliknya
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
}
first-letter-to-lower-xc () {v-first-letter-to-lower | xclip-clipboard pilihan}
Bagaimana jika karakter pertama bukan huruf (tetapi tab, spasi, dan kutipan ganda yang lolos)? Lebih baik kita menguji itu sampai kita menemukan surat! Begitu:
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=
$[...]). Anda menggunakan banyak tanda kurung yang tidak berguna. Anda mengasumsikan bahwa string terdiri dari karakter dari alfabet latin (bagaimana dengan huruf aksentuasi, atau huruf dalam huruf lain?). Anda memiliki banyak pekerjaan untuk membuat cuplikan ini dapat digunakan! (dan karena Anda menggunakan regex, Anda mungkin juga menggunakan regex untuk menemukan huruf pertama, bukan loop).
tr :if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foocontoh situasi di mana pengurai mengharapkan daftar kata-kata ; jadi di Anda echo ${F}, isi Fstring-split dan glob-diperluas. Hal yang sama berlaku untuk echo ${S:$N:1}contoh dan yang lainnya. Lihat BashPitfalls # 14 .