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.
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.
Yanıtlar:
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 pattern
kullanı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). bash
Sö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ı: " zsh
sözdizimi çalışmıyorbash
.
${string,,}
Notasyonu sadece bash sürümü bulunmaktadır 4+. Aksi takdirde, gibi diğer çözümlerden biri gerekir $(echo $string | tr '[:upper:]' '[:lower:]')
.
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 declare
ve 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Ą
gawk
varsayılan awk (ile gösterildiği gibi update-alternatives --display awk
) var. mawk
13.10’da varsayılan olduğundan emin misiniz ?
sed
1990'dan bu yana \U
seç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!
uc
, use Encode
ya 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
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.
typeset
değiştirilmiş ve değiştirilmiş görünüyordeclare
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:
Kredi siberlığa gidiyor
tr A-Z a-z
işe yarayacak.
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 \L
tam tersi bir etkiye sahip olacak:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
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