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.



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 .


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Ą

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.


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


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

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

-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

1
Seperti disebutkan dalam komentar pada jawaban yang lebih lama , ini tidak akan berfungsi untuk beberapa lokal.
muru
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.