Konvertieren Sie den gesamten Text von Groß- in Kleinbuchstaben und umgekehrt?
17
Meine Frage ist, wie ich den gesamten Text von Groß- in Kleinbuchstaben und umgekehrt konvertieren kann. Das heißt, die Groß- und Kleinschreibung aller Buchstaben zu ändern. Es muss sedirgendwie mit einem Ersatz getan werden .
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
oder ein kürzerer Weg mit GNU sed, mit jedem Zeichen zu arbeiten, für das in Ihrem Gebietsschema eine Konvertierung in Kleinbuchstaben <-> in Großbuchstaben existiert:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
Ihre zweite geht von einer GNU sedund einer alternativen Schreibweise in der Eingabe aus. Verwenden Sie sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'stattdessen (immer noch GNU-spezifisch). Der erste konvertiert nur die 26 lateinischen ASCII-Buchstaben, während der zweite alle Buchstaben konvertiert, die von Ihrem Gebietsschema als solche erkannt wurden. Das trmacht nur in ASCII-Sprachumgebungen Sinn. Der perleine funktioniert nur für lateinische ASCII-Buchstaben.
Stéphane Chazelas
16
POSIXly, das ist nur möglich, sedwenn Sie den vollständigen Satz von Buchstaben bereitstellen, die Sie transliterieren möchten, wie @cuonglm gezeigt hat .
Es könnte aber gemacht werden tr, und das ist, wofür tr(transliterate):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Unter Linux gibt es jedoch Einschränkungen. Von den drei trImplementierungen, die häufig auf Linux-basierten Systemen zu finden sind:
Mit GNU trfunktioniert das nur für Einzelbyte-Zeichensätze. Zum Beispiel auf Stéphane Chazelasin UTF-8-Gebietsschemas, die sTéPHANE cHAZELASanstelle von gibt sTÉPHANE cHAZELAS. Das ist eine bekannte Einschränkung von GNU tr.
Mit trdem Erbstück-Werkzeugkasten funktioniert das nicht stéphane chazelas.
So etwas macht busybox trnicht.
Unter FreeBSD funktioniert das jedoch einwandfrei. Sie würden erwarten, dass es auch in zertifizierten Unix-Systemen einwandfrei funktioniert.
Also in der Desktop-Welt macht es nur OSX? Warum kann es nicht funktionieren? Handelt es sich nur um die verschiedenen Implementierungen, da der Hexadezimalwert einen konstanten Versatz zwischen der Kleinbuchstabenversion des akzentuierten Zeichens und seinem Gegenstück in Großbuchstaben aufweist?
1
@ illuminÉ, nicht sicher, was du mit Desktop-Welt meinst . AFAICS, das Problem ist mit GNU, die meisten Unices haben "Desktops". Abgesehen von ASCII und einigen iso8859-Zeichensätzen bin ich mir nicht bewusst, dass Sie das Hex-Offset-Ding verallgemeinern können, und das würde mit Codierungen wie UTF-8 keinen Sinn ergeben. Zum Beispiel in UTF-8 ist Großbuchstabe ⴠ(e2 b4 a0) Ⴠ(e1 83 80); Sowohl i(69) als auch ı(c4 b1) haben I(49) als Großbuchstaben (außer in türkischen Gebietsschemata, wo iwird İ). Der Grund, warum es mit GNU nicht funktioniert, trist, dass GNU trmit Bytes und nicht mit Zeichen arbeitet.
Stéphane Chazelas
Ich meinte irgendwie Mainstream, aber es macht keinen Sinn, also danke für das Heads-up. Ich habe mir nur die Zeichen mit französischem Akzent (und wirklich nur "é") angesehen und sehr vereinfachende Annahmen getroffen, wobei ich wieder vergessen habe, dass es sich um Bytes handelt. Aber das Erbstück? Ich werde diese Antwort noch einmal lesen!
1
@ illuminÉ, für Erbstücke ist es ein anderes Problem, es scheint nur ein Vorkommen von [:lower:]oder zu unterstützen [:upper:](das erste wird ignoriert). Auch in Französisch œ -> Œist c5 93 -> c5 92in UTF-8 und bd -> bcin ISO8859-15.
Stéphane Chazelas
2
Dies hat zwar dieselben Einschränkungen wie die trvon Stéphane Chazelas angebotene Lösung, ist jedoch eine andere Möglichkeit:
Ich Dump stderrin /dev/nulldort , weil ddauch Statistiken aller seiner Operationen auf dem bietet 2Dateideskriptor. Dies kann nützlich sein, je nachdem, was Sie tun, war aber nicht für diese Demonstration. Alle anderen Dinge, die Sie damit machen können, gelten ddweiterhin, zum Beispiel:
Der Fall wird jedoch nicht vertauscht (da in aBcnicht konvertiert wird AbC).
Stéphane Chazelas
1
@ StéphaneChazelas - stimmt, aber wenn ich nicht falsch verstanden habe, war das nicht die Frage, oder?
mikeserv
2
Wenn Ihr Hauptziel darin besteht, eine Datei von Unterklasse zu Oberklasse zu konvertieren , warum verwenden Sie diese nicht trund STDOUTkonvertieren Ihre Datei:
$cat FILENAME | tr a-z A-Z > FILENAME2
Wo FILENAMEist deine Originaldatei? Wo FILENAME2ist Ihre konvertierte Ausgabedatei?
tr
wäre besser geeignet alssed
.Antworten:
Hier ist ein gerader Weg in
sed
:oder ein kürzerer Weg mit GNU
sed
, mit jedem Zeichen zu arbeiten, für das in Ihrem Gebietsschema eine Konvertierung in Kleinbuchstaben <-> in Großbuchstaben existiert:wenn Sie andere Tools verwenden können, wie:
perl
(beschränkt auf ASCII-Buchstaben):perl
(allgemeiner):quelle
sed
und einer alternativen Schreibweise in der Eingabe aus. Verwenden Siesed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
stattdessen (immer noch GNU-spezifisch). Der erste konvertiert nur die 26 lateinischen ASCII-Buchstaben, während der zweite alle Buchstaben konvertiert, die von Ihrem Gebietsschema als solche erkannt wurden. Dastr
macht nur in ASCII-Sprachumgebungen Sinn. Derperl
eine funktioniert nur für lateinische ASCII-Buchstaben.POSIXly, das ist nur möglich,
sed
wenn Sie den vollständigen Satz von Buchstaben bereitstellen, die Sie transliterieren möchten, wie @cuonglm gezeigt hat .Es könnte aber gemacht werden
tr
, und das ist, wofürtr
(transliterate):Unter Linux gibt es jedoch Einschränkungen. Von den drei
tr
Implementierungen, die häufig auf Linux-basierten Systemen zu finden sind:tr
funktioniert das nur für Einzelbyte-Zeichensätze. Zum Beispiel aufStéphane Chazelas
in UTF-8-Gebietsschemas, diesTéPHANE cHAZELAS
anstelle von gibtsTÉPHANE cHAZELAS
. Das ist eine bekannte Einschränkung von GNUtr
.tr
dem Erbstück-Werkzeugkasten funktioniert das nichtstéphane chazelas
.tr
nicht.Unter FreeBSD funktioniert das jedoch einwandfrei. Sie würden erwarten, dass es auch in zertifizierten Unix-Systemen einwandfrei funktioniert.
Die
bash
Shell hat dafür einen eigenen Operator:Mit
zsh -o extendedglob
:quelle
ⴠ
(e2 b4 a0)Ⴠ
(e1 83 80); Sowohli
(69) als auchı
(c4 b1) habenI
(49) als Großbuchstaben (außer in türkischen Gebietsschemata, woi
wirdİ
). Der Grund, warum es mit GNU nicht funktioniert,tr
ist, dass GNUtr
mit Bytes und nicht mit Zeichen arbeitet.[:lower:]
oder zu unterstützen[:upper:]
(das erste wird ignoriert). Auch in Französischœ -> Œ
istc5 93 -> c5 92
in UTF-8 undbd -> bc
in ISO8859-15.Dies hat zwar dieselben Einschränkungen wie die
tr
von Stéphane Chazelas angebotene Lösung, ist jedoch eine andere Möglichkeit:AUSGABE
Ich Dump
stderr
in/dev/null
dort , weildd
auch Statistiken aller seiner Operationen auf dem bietet2
Dateideskriptor. Dies kann nützlich sein, je nachdem, was Sie tun, war aber nicht für diese Demonstration. Alle anderen Dinge, die Sie damit machen können, geltendd
weiterhin, zum Beispiel:AUSGABE:
quelle
aBc
nicht konvertiert wirdAbC
).Wenn Ihr Hauptziel darin besteht, eine Datei von Unterklasse zu Oberklasse zu konvertieren , warum verwenden Sie diese nicht
tr
undSTDOUT
konvertieren Ihre Datei:Wo
FILENAME
ist deine Originaldatei? WoFILENAME2
ist Ihre konvertierte Ausgabedatei?quelle
é
zum Beispiel (zumindest in meiner Datei).mit
awk
:quelle
>file.txt
würde mit dem Abschneiden der Datei beginnenruby
hat eine String-Methode dafür, ähnlich wie bei der Kommandozeileperl
Siehe auch ruby-doc-Kodierung
quelle
Halte die einfache Sache einfach. Der Filter für die Übersetzung von Zeichen lautet
tr
.quelle