Büyük harfli bir dizgiyi küçük harfe dönüştürme komutu?


47

Büyük harfli bir dizgiyi küçük harfli veya tam tersine dönüştürmek için kullanabileceğim Bash komutu nedir?

Teşekkür ederim.



2
Stackoverflow.com/questions/2264428/… adresinde de birçok çözüm var . Bir lanet bakışla çoğu burada da ele alınacak gibi görünüyor.
pbhj

Yanıtlar:


59

Dize zaten bir değişkende saklanmışsa, bash's parametresi genişlemesini, özellikle ${parameter,,pattern}(bash 4.0'dan beri kullanılabilir) kullanabilirsiniz; burada parameter, değişkeninizin adıdır ve patternkullanılmaz:

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

Bunun değişkenin değerini değiştirmediğini, yalnızca çıktının değiştiğini unutmayın. Değişkeni değiştirmek için yeni değeri atamanız gerekir:

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

Büyük harf dönüşümü şu şekilde çalışır ${parameter^^pattern}:

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

Bu, Unicode dizeleriyle de çalışır (en azından şu anki bash sürümleriyle, muhtemelen en az bash 4.3'e gereksinim duyar):

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

Eğer kullanıyorsanız zsh, kullanabileceğiniz Parametre Genişleme Flags ( ${(FLAGS)NAME}aynı sonuçları elde etmek; zsh 2.5 ve sonrasında mevcuttur). bashSözdizimi çalışmaz zsh ) 1 . Küçük harf için bayrak L; büyük harf için U:

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

Bu aynı zamanda Unicode dizeleriyle de çalışır (en azından zsh 5.0'dan beri; daha önceki sürümlerle denemedim):

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



1) Zsh'nin bunu daha uzun süre sürdürdüğünü görünmesine rağmen, muhtemelen şöyle olmalı: " zshsözdizimi çalışmıyorbash .


3
${string,,}Notasyonu sadece bash sürümü bulunmaktadır 4+. Aksi takdirde, gibi diğer çözümlerden biri gerekir $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant

40

Unicode ile doğru çalışan çok az yöntem var:

GNU sed 4.2.2 işleri :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 beyan yapar değil iş:

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

bash 4.2.45 parametre genişleme yapar değil iş:

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

bash 4.3.42 declareve parametre genişletme çalışmaları :

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

GNU tr 8.20 yapar değil işi:

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

mawk (Ubuntu 13.10 varsayılan awk) yapar değil işi:

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

gawk çalışır :

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

Perl saf uc () yapar değil işi:

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

Herhangi bir Unicode ipuçları olmadan Python 2 gelmez değil çalışır:

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

Python 2, Unicode işleri ile ilgilenmesi istendiğinde :

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

Python 3 işleri :

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

1
13.04 Ubuntu'da gawkvarsayılan awk (ile gösterildiği gibi update-alternatives --display awk) var. mawk13.10’da varsayılan olduğundan emin misiniz ?
kiri

sed1990'dan bu yana \Useçeneği destekledi ;-). Gnu-sed özel bir özellik değil. Aksi takdirde, büyük cevap, çok seçenek, çok az zaman ;-) Herkese iyi şanslar!
shellter

Ayrıca, aşağıdaki bağlantılara daha fazla bakabilmek için Türkçe ile (noktalı ve noktasız i) bazı sorunlar olacaktır: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - tr.wikipedia. org / wiki / Dotted_and_dotless_I
azat

Örneğinizde uc, use Encodeya da zorunda olduğunuz için cüzdan Perl'de çalışmıyor use utf8. Örneğinizi yeniden yazın echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'ve çalışacak. Ayrıca bkz. Stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy

20

Küçük harfli bir değişken tanımlamak için bash internal setset veya declare komutunu kullanırdım.

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

Değer ayarlandığında karakterler değişkeni yazarken değil, karakterler düşürülür. Bu yüzden betiğin başında dizgi yazmak daha iyidir. Büyük harf için -u yazabilirsiniz .

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

Bu, ksh üzerinde de çalışan bash kabuğuna özgü değildir, belki de POSIX kabuk tanımındadır.

EDIT: Pek çok kişi, nazikçe dizilimin şimdi bash üzerinde modası geçmiş olarak kabul edildiğini ve ilan edildiğini belirtti . Her iki komut da eşdeğerdir.

$ 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.

Kendimi hala heterojen bir ortamda çalışırken dizgi sözdizimini kullanıyorum, bu yüzden senaryolarımı tekrar yazmam gerekmiyor.


2
+1 İnanılmaz, bunu asla bilemedim! btw biraz daha fazla bilgi: Kılavuza baktım ve görünüşe göre typesetdeğiştirilmiş ve değiştirilmiş görünüyordeclare
thom

1
@thom teşekkür ederim, sanırım bash "bourne kabuğu köklerinden" uzak bir hayata sahip olmaya başladı :)
Emmanuel

17

Komutla yapabilirsiniz tr.

Terminalde ( Ctrl+ Alt+ T)

Bu komut:

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

küçük harfleri büyük harfe dönüştürür.

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

büyük harfe küçük harfe dönüştürülür.

Örnek:

görüntü tanımını buraya girin

Kredi siberlığa gidiyor


2
Yerelleri umursamıyorsan, tr A-Z a-zişe yarayacak.
Nick Matteo,

9

Sen de bir şeyler yapabilirsin sed:

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

Ve \Ltam tersi bir etkiye sahip olacak:

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

1

Bu saf bir bash çözümü değil, ancak perl( Oli'nin yaptığı gibi sed) tellerinizi yönlendirebilirsiniz :

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

Ve \Ltam tersi bir etkiye sahip olacak:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase

-1

Bu basit komutu kullanın Büyük küçük harf için 'f', dönüşüm yapmak istediğiniz dosya adıdır.

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

Küçük harfe küçük harf için

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

1
Daha eski bir cevaba yapılan yorumda da belirtildiği gibi , bu bazı bölgeler için işe yaramaz.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.