Perintah untuk mengubah string huruf besar ke huruf kecil?

47

Apa perintah Bash yang bisa saya gunakan untuk mengonversi string huruf besar menjadi huruf kecil dan sebaliknya?

Terima kasih.

rɑːdʒɑ
sumber
2
Kemungkinan sama dengan: unix.stackexchange.com/questions/51983/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
2
Banyak solusi di stackoverflow.com/questions/2264428/… juga. Dengan pandangan sepintas sebagian besar tampaknya akan dibahas di sini juga.
pbhj

Jawaban:

59

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:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Perhatikan bahwa ini tidak mengubah nilai variabel, hanya output. Untuk mengubah variabel Anda harus menetapkan nilai baru:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

Konversi huruf besar bekerja dengan ${parameter^^pattern}:

$ echo ${string^^}
HELLO, WORLD!

Ini juga berfungsi dengan string Unicode (setidaknya dengan versi bash saat ini, mungkin membutuhkan setidaknya bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

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 zsh 1) . Bendera untuk huruf kecil adalah L; untuk huruf besar adalah U:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Ini juga berfungsi dengan string Unicode (setidaknya sejak zsh 5.0; saya tidak mencoba dengan versi sebelumnya):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) Meskipun, melihat bahwa zsh memiliki ini lebih lama, mungkin seharusnya: " zshsintaks tidak berfungsibash .

Adaephon
sumber
3
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Ą

bash 4.2.45 menyatakan tidak bekerja:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

bash 4.2.45 perluasan parameter tidak berfungsi:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declaredan pekerjaan perluasan parameter :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 tidak berfungsi:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (default awk di Ubuntu 13.10) tidak berfungsi:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

pekerjaan gawk :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc () tidak berfungsi:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

Python 2 tanpa petunjuk Unicode tidak berfungsi:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 ketika diperintahkan untuk berurusan dengan karya Unicode :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3 berfungsi :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
Michał Šrajer
sumber
1
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!
shellter
Plus akan ada beberapa masalah dengan bahasa Turki (i titik-titik dan titik), untuk lebih banyak melihat tautan berikut: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia. org / wiki / Dotted_and_dotless_I
azat
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.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Karakter diturunkan ketika nilai ditetapkan, bukan saat Anda mengetik variabel. Jadi lebih baik mengeset di awal skrip. Untuk huruf besar, Anda dapat mengeset -u .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

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.

Emmanuel
sumber
2
+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" :)
Emmanuel
17

Anda bisa melakukannya dengan trperintah.

Di terminal ( Ctrl+ Alt+ T)

Perintah ini:

echo 'String here' | tr "[:lower:]" "[:upper:]"

akan mengubah huruf kecil menjadi huruf besar.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

akan mengonversi huruf besar menjadi huruf kecil.

Contoh:

masukkan deskripsi gambar di sini

Kredit jatuh ke dunia cyber

rɑːdʒɑ
sumber
2
Jika Anda tidak peduli dengan lokal, tr A-Z a-zakan berhasil juga.
Nick Matteo
9

Anda juga dapat menyalurkan berbagai hal melalui sed:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

Dan \Lakan memiliki efek sebaliknya:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
Oli
sumber
1

Ini bukan solusi bash murni, tetapi Anda dapat menyalurkan string Anda perl(seperti yang dilakukan Olised ):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

Dan \Lakan memiliki efek sebaliknya:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Sylvain Pineau
sumber
-1

Gunakan perintah sederhana ini Untuk huruf besar ke huruf kecil Di mana 'f' adalah nama file tempat Anda ingin melakukan konversi.

tr "A-Z" "a-z" < f

Untuk huruf kecil ke huruf besar

tr "a-z" "A-Z" < f
mendongkrak
sumber
1
Seperti disebutkan dalam komentar pada jawaban yang lebih lama , ini tidak akan berfungsi untuk beberapa lokal.
muru