Viele Lösungen finden Sie auch unter stackoverflow.com/questions/2264428/… . Mit einem flüchtigen Blick scheinen auch hier die meisten abgedeckt zu sein.
pbhj
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:
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 zsh1) . Das Flag für Kleinbuchstaben ist L; für Großbuchstaben ist es U:
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Ą
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!
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.
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 .
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.
+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 :)
Antworten:
Wenn die Zeichenfolge bereits in einer Variablen gespeichert ist, können Sie die
bash
Parametererweiterung verwenden${parameter,,pattern}
(verfügbar seit Bash 4.0), wobeiparameter
der Name Ihrer Variablen angegeben undpattern
weggelassen wird: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:
Die Konvertierung in Großbuchstaben funktioniert mit
${parameter^^pattern}
:Dies funktioniert auch mit Unicode-Strings (mindestens mit aktuellen Bash-Versionen, benötigt wahrscheinlich mindestens Bash 4.3):
Wenn Sie verwenden
zsh
, können Sie Parameter-Erweiterungsflags (${(FLAGS)NAME}
verfügbar seit zsh 2.5) verwenden, um die gleichen Ergebnisse zu erzielen. Diebash
Syntax funktioniert nicht inzsh
1) . Das Flag für Kleinbuchstaben istL
; für Großbuchstaben ist esU
:Dies funktioniert auch mit Unicode-Strings (spätestens seit zsh 5.0; ich habe es nicht mit früheren Versionen versucht):
1) Obwohl, da zsh dies schon viel länger hatte, sollte es wahrscheinlich sein: "Die
zsh
Syntax funktioniert nicht inbash
.quelle
${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:]')
.Es gibt nur sehr wenige Methoden, die mit Unicode korrekt funktionieren:
GNU sed 4.2.2 funktioniert :
bash 4.2.45 declare funktioniert nicht :
Bash 4.2.45 Parametererweiterung funktioniert nicht :
bash 4.3.42
declare
und Parameter Expansion Arbeit :GNU tr 8.20 funktioniert nicht :
mawk (Standard awk in Ubuntu 13.10) funktioniert nicht :
gawk arbeitet :
Perl pure uc () funktioniert nicht :
Python 2 ohne Unicode-Hinweise funktioniert nicht :
Python 2 , wenn sie mit Unicode umgehen instruiert Werke :
Python 3 funktioniert :
quelle
gawk
als Standard awk (wie mit gezeigtupdate-alternatives --display awk
). Sind Sie sicher, dassmawk
der Standard in 13.10 ist?sed
s haben seit 1990 die\U
Option unterstützt ;-). Kein spezielles Merkmal. Ansonsten tolle Antwort, so viele Möglichkeiten, so wenig Zeit ;-) Viel Glück an alle!uc
funktioniert purse in Perl nicht, weil Sieuse Encode
oder müssenuse utf8
. Schreiben Sie Ihr Beispiel umecho "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/3701431Ich würde den internen Befehl " bash typeset" oder " declare" verwenden , um eine Variable in Kleinbuchstaben zu definieren.
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 .
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.
Ich selbst verwende immer noch die Schriftsatzsyntax, wenn ich in einer heterogenen Umgebung arbeite, sodass ich meine Skripte nicht umschreiben muss.
quelle
typeset
man eigentlich depricated und ersetzt durchdeclare
Sie können es mit dem
tr
Befehl tun .Im Terminal ( Ctrl+ Alt+ T)
Dieser Befehl:
wandelt Kleinbuchstaben in Großbuchstaben um.
wandelt Großbuchstaben in Kleinbuchstaben um.
Beispiel:
Kredit geht an Cybercity
quelle
tr A-Z a-z
funktioniert dies auch.Sie können auch Dinge
sed
durchpfeifen:Und
\L
wird den gegenteiligen Effekt haben:quelle
Es ist keine reine Bash-Lösung, aber Sie können Ihre Saiten durchpfeifen
perl
(wie Oli es tatsed
):Und
\L
wird den gegenteiligen Effekt haben:quelle
Verwenden Sie diesen einfachen Befehl Für Groß- und Kleinschreibung. Wobei 'f' der Dateiname ist, in den Sie konvertieren möchten.
Für Groß- und Kleinschreibung
quelle