Befehl zum Konvertieren einer Zeichenfolge in Kleinbuchstaben?

Antworten:

59

Wenn die Zeichenfolge bereits in einer Variablen gespeichert ist, können Sie die bashParametererweiterung verwenden ${parameter,,pattern}(verfügbar seit Bash 4.0), wobei parameterder Name Ihrer Variablen angegeben und patternweggelassen wird:

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

Beachten Sie, dass dies nicht den Wert der Variablen ändert, sondern nur die Ausgabe. Um die Variable zu ändern, müssen Sie den neuen Wert zuweisen:

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

Die Konvertierung in Großbuchstaben funktioniert mit ${parameter^^pattern}:

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

Dies funktioniert auch mit Unicode-Strings (mindestens mit aktuellen Bash-Versionen, benötigt wahrscheinlich mindestens Bash 4.3):

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

Wenn Sie verwenden zsh, können Sie Parameter-Erweiterungsflags ( ${(FLAGS)NAME}verfügbar seit zsh 2.5) verwenden, um die gleichen Ergebnisse zu erzielen. Die bashSyntax funktioniert nicht in zsh 1) . Das Flag für Kleinbuchstaben ist L; für Großbuchstaben ist es U:

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

Dies funktioniert auch mit Unicode-Strings (spätestens seit zsh 5.0; ich habe es nicht mit früheren Versionen versucht):

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



1) Obwohl, da zsh dies schon viel länger hatte, sollte es wahrscheinlich sein: "Die zshSyntax funktioniert nicht inbash .

Adaephon
quelle
3
Die ${string,,}Notation existiert nur für die Bash-Version 4+. Ansonsten ist eine der anderen Lösungen erforderlich, wie z $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant
40

Es gibt nur sehr wenige Methoden, die mit Unicode korrekt funktionieren:

GNU sed 4.2.2 funktioniert :

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

bash 4.2.45 declare funktioniert nicht :

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

Bash 4.2.45 Parametererweiterung funktioniert nicht :

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

bash 4.3.42 declareund Parameter Expansion Arbeit :

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

GNU tr 8.20 funktioniert nicht :

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

mawk (Standard awk in Ubuntu 13.10) funktioniert nicht :

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

gawk arbeitet :

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

Perl pure uc () funktioniert nicht :

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

Python 2 ohne Unicode-Hinweise funktioniert nicht :

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

Python 2 , wenn sie mit Unicode umgehen instruiert Werke :

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

Python 3 funktioniert :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
Michał Šrajer
quelle
1
Auf Ubuntu 13.04 habe ich gawkals Standard awk (wie mit gezeigt update-alternatives --display awk). Sind Sie sicher, dass mawkder Standard in 13.10 ist?
kiri
seds haben seit 1990 die \UOption unterstützt ;-). Kein spezielles Merkmal. Ansonsten tolle Antwort, so viele Möglichkeiten, so wenig Zeit ;-) Viel Glück an alle!
Shellter
Außerdem wird es einige Probleme mit Türkisch geben (gepunktet und ohne Punkte). Weitere Informationen finden Sie unter den folgenden Links: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - de.wikipedia . org / wiki / Dotted_and_dotless_I
azat
In Ihrem Beispiel ucfunktioniert purse in Perl nicht, weil Sie use Encodeoder müssen use utf8. Schreiben Sie Ihr Beispiel um echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'und es wird funktionieren. Siehe auch stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy
20

Ich würde den internen Befehl " bash typeset" oder " declare" verwenden , um eine Variable in Kleinbuchstaben zu definieren.

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

Die Zeichen werden verringert, wenn der Wert festgelegt wird, und nicht, wenn Sie die Variable festlegen. Es ist also besser, am Anfang des Skripts zu setzen. Für Großbuchstaben können Sie -u eingeben .

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

Dies ist nicht spezifisch für die Bash-Shell, die auch für ksh funktioniert, möglicherweise in der POSIX-Shell-Definition.

EDIT: Viele Menschen sanft zeigte mir die Tatsache , dass typeset jetzt veraltet auf bash betrachtet und ersetzt durch declare . Beide Befehle sind gleichwertig.

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

Ich selbst verwende immer noch die Schriftsatzsyntax, wenn ich in einer heterogenen Umgebung arbeite, sodass ich meine Skripte nicht umschreiben muss.

Emmanuel
quelle
2
+1 Unglaublich, ich habe das nie gewusst! btw einige zusätzliche Informationen: sah ich diese oben im Handbuch und es scheint , dass typesetman eigentlich depricated und ersetzt durchdeclare
THOM
1
@thom danke, es scheint, dass bash begann, ein Leben fern von seinen "Borowski Shell Roots" zu haben :)
Emmanuel
17

Sie können es mit dem trBefehl tun .

Im Terminal ( Ctrl+ Alt+ T)

Dieser Befehl:

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

wandelt Kleinbuchstaben in Großbuchstaben um.

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

wandelt Großbuchstaben in Kleinbuchstaben um.

Beispiel:

Bildbeschreibung hier eingeben

Kredit geht an Cybercity

rɑːdʒɑ
quelle
2
Wenn Sie sich nicht für Gebietsschemas interessieren, tr A-Z a-zfunktioniert dies auch.
Nick Matteo
9

Sie können auch Dinge seddurchpfeifen:

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

Und \Lwird den gegenteiligen Effekt haben:

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

Es ist keine reine Bash-Lösung, aber Sie können Ihre Saiten durchpfeifen perl(wie Oli es tat sed):

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

Und \Lwird den gegenteiligen Effekt haben:

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

Verwenden Sie diesen einfachen Befehl Für Groß- und Kleinschreibung. Wobei 'f' der Dateiname ist, in den Sie konvertieren möchten.

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

Für Groß- und Kleinschreibung

tr "a-z" "A-Z" < f
Jack
quelle
1
Wie in einem Kommentar zu einer älteren Antwort erwähnt , funktioniert dies bei einigen Gebietsschemas nicht.
Muru