Jika string sudah disimpan dalam variabel, Anda dapat menggunakan bashekspansi parameter, secara spesifik ${parameter,,pattern}(tersedia sejak bash 4.0), di mana parameternama variabel Anda dan patterndinonaktifkan:
Jika Anda menggunakan zsh, Anda dapat menggunakan Bendera Ekspansi Parameter ( ${(FLAGS)NAME}; tersedia sejak zsh 2.5) untuk mencapai hasil yang sama. The bashsintaks tidak bekerja di zsh1) . Bendera untuk huruf kecil adalah L; untuk huruf besar adalah U:
The ${string,,}notasi hanya ada untuk versi pesta 4 +. Kalau tidak, salah satu solusi lain diperlukan, seperti $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant
40
Ada beberapa metode yang bekerja dengan benar dengan Unicode:
GNU sed 4.2.2 berfungsi :
$ echo "Idą gęsi łąką"| sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ
Pada Ubuntu 13.04, saya memiliki gawkawk sebagai default (seperti yang ditunjukkan dengan update-alternatives --display awk). Apakah Anda yakin mawkapakah default di 13.10?
kiri
sedsejak 1990 telah mendukung \Uopsi ;-). Bukan fitur spesifik gnu-sed. Kalau tidak, jawaban yang bagus, begitu banyak pilihan, begitu sedikit waktu ;-) Semoga sukses untuk semua!
Dalam contoh Anda, dompet uctidak berfungsi di Perl karena Anda harus use Encodeatau use utf8. Tulis ulang contoh Anda sebagai echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'dan itu akan berhasil. Lihat juga stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy
20
Saya akan menggunakan bash internal yang mengeset atau declare perintah untuk mendefinisikan variabel huruf kecil.
Karakter diturunkan ketika nilai ditetapkan, bukan saat Anda mengetik variabel. Jadi lebih baik mengeset di awal skrip. Untuk huruf besar, Anda dapat mengeset -u .
Ini tidak spesifik untuk bash shell, yang berfungsi juga pada ksh, mungkin dalam definisi shell POSIX.
EDIT: Banyak orang dengan lembut menunjukkan kepada saya fakta bahwa mengeset sekarang dianggap usang pada bash dan diganti dengan menyatakan . Kedua perintah itu setara.
$ help typeset
typeset: typeset [-aAfFgilrtux][-p] name[=value]...Set variable values and attributes.Obsolete.See`help declare'.
$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
Set variable values and attributes.
Saya sendiri masih menggunakan sintaksis typeset karena saya bekerja pada lingkungan yang heterogen, jadi saya tidak perlu menulis ulang skrip saya.
+1 Luar Biasa, saya tidak pernah tahu itu! btw beberapa info tambahan: Saya melihat ini di manual dan tampaknya typesetdianggap sudah diganti dan diganti olehdeclare
thom
1
@thom, terima kasih, tampaknya bash mulai memiliki kehidupan yang jauh dari "bourne shell root" :)
Jawaban:
Jika string sudah disimpan dalam variabel, Anda dapat menggunakan
bash
ekspansi parameter, secara spesifik${parameter,,pattern}
(tersedia sejak bash 4.0), di manaparameter
nama variabel Anda danpattern
dinonaktifkan:Perhatikan bahwa ini tidak mengubah nilai variabel, hanya output. Untuk mengubah variabel Anda harus menetapkan nilai baru:
Konversi huruf besar bekerja dengan
${parameter^^pattern}
:Ini juga berfungsi dengan string Unicode (setidaknya dengan versi bash saat ini, mungkin membutuhkan setidaknya bash 4.3):
Jika Anda menggunakan
zsh
, Anda dapat menggunakan Bendera Ekspansi Parameter (${(FLAGS)NAME}
; tersedia sejak zsh 2.5) untuk mencapai hasil yang sama. Thebash
sintaks tidak bekerja dizsh
1) . Bendera untuk huruf kecil adalahL
; untuk huruf besar adalahU
:Ini juga berfungsi dengan string Unicode (setidaknya sejak zsh 5.0; saya tidak mencoba dengan versi sebelumnya):
1) Meskipun, melihat bahwa zsh memiliki ini lebih lama, mungkin seharusnya: "
zsh
sintaks tidak berfungsibash
.sumber
${string,,}
notasi hanya ada untuk versi pesta 4 +. Kalau tidak, salah satu solusi lain diperlukan, seperti$(echo $string | tr '[:upper:]' '[:lower:]')
.Ada beberapa metode yang bekerja dengan benar dengan Unicode:
GNU sed 4.2.2 berfungsi :
bash 4.2.45 menyatakan tidak bekerja:
bash 4.2.45 perluasan parameter tidak berfungsi:
bash 4.3.42
declare
dan pekerjaan perluasan parameter :GNU tr 8.20 tidak berfungsi:
mawk (default awk di Ubuntu 13.10) tidak berfungsi:
pekerjaan gawk :
Perl pure uc () tidak berfungsi:
Python 2 tanpa petunjuk Unicode tidak berfungsi:
Python 2 ketika diperintahkan untuk berurusan dengan karya Unicode :
Python 3 berfungsi :
sumber
gawk
awk sebagai default (seperti yang ditunjukkan denganupdate-alternatives --display awk
). Apakah Anda yakinmawk
apakah default di 13.10?sed
sejak 1990 telah mendukung\U
opsi ;-). Bukan fitur spesifik gnu-sed. Kalau tidak, jawaban yang bagus, begitu banyak pilihan, begitu sedikit waktu ;-) Semoga sukses untuk semua!uc
tidak berfungsi di Perl karena Anda harususe Encode
atauuse utf8
. Tulis ulang contoh Anda sebagaiecho "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
dan itu akan berhasil. Lihat juga stackoverflow.com/a/13261662/3701431Saya akan menggunakan bash internal yang mengeset atau declare perintah untuk mendefinisikan variabel huruf kecil.
Karakter diturunkan ketika nilai ditetapkan, bukan saat Anda mengetik variabel. Jadi lebih baik mengeset di awal skrip. Untuk huruf besar, Anda dapat mengeset -u .
Ini tidak spesifik untuk bash shell, yang berfungsi juga pada ksh, mungkin dalam definisi shell POSIX.
EDIT: Banyak orang dengan lembut menunjukkan kepada saya fakta bahwa mengeset sekarang dianggap usang pada bash dan diganti dengan menyatakan . Kedua perintah itu setara.
Saya sendiri masih menggunakan sintaksis typeset karena saya bekerja pada lingkungan yang heterogen, jadi saya tidak perlu menulis ulang skrip saya.
sumber
typeset
dianggap sudah diganti dan diganti olehdeclare
Anda bisa melakukannya dengan
tr
perintah.Di terminal ( Ctrl+ Alt+ T)
Perintah ini:
akan mengubah huruf kecil menjadi huruf besar.
akan mengonversi huruf besar menjadi huruf kecil.
Contoh:
Kredit jatuh ke dunia cyber
sumber
tr A-Z a-z
akan berhasil juga.Anda juga dapat menyalurkan berbagai hal melalui
sed
:Dan
\L
akan memiliki efek sebaliknya:sumber
Ini bukan solusi bash murni, tetapi Anda dapat menyalurkan string Anda
perl
(seperti yang dilakukan Olised
):Dan
\L
akan memiliki efek sebaliknya:sumber
Gunakan perintah sederhana ini Untuk huruf besar ke huruf kecil Di mana 'f' adalah nama file tempat Anda ingin melakukan konversi.
Untuk huruf kecil ke huruf besar
sumber