Wenn ich eine Zeichenfolge habe, die so aussieht:
"this_is_the_string"
Innerhalb eines Bash-Skripts möchte ich es in PascalCase konvertieren, dh UpperCamelCase sieht folgendermaßen aus:
"ThisIsTheString"
Ich habe festgestellt, dass die Konvertierung in lowerCamelCase folgendermaßen erfolgen kann:
"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'
Leider kenne ich mich mit Regexen nicht aus, um dies zu ändern.
shell-script
user1135541
quelle
quelle
\U\2
fügt den gefundenen Text aus der zweiten Gruppe ein, der in ALL CAPS konvertiert wurde. Vergleichen Sie mit\u\2
, um den Text in Groß- und Kleinschreibung einzufügen. Dabei wird nur das erste Zeichen großgeschrieben. (2) Alle unten aufgeführten Beispiele übersetzen "this_is_a_string" in "ThisIsAString". Dies ist genau das, wonach Sie gefragt haben, aber es ist etwas schwer zu lesen. Möglicherweise möchten Sie Ihre Anforderungen für den Sonderfall eines Ein-Buchstaben-Wortes (Teilzeichenfolge) überarbeiten. … (Fortsetzung)(^|_)
zu(\<|_)
.Antworten:
Ersetzen Sie das Muster
(^|_)
am Anfang der Zeichenfolge oder nach einem Unterstrich - erste Gruppe([a-z])
einzelner Kleinbuchstabe - zweite Gruppe,indem Sie die
\U\2
zweite Gruppeg
global in Großbuchstaben setzen .quelle
\U
ist eine GNU-Erweiterung für POSIX.sed -r 's/(^|[-_ ]+)([0-9a-z])/\U\2/g'
. Also funktionieren auch Strings wie "this_is_2nd_string" .bash
Wenn Sie Ihre Zeichenfolge in einer Variablen gespeichert haben, können Sie sie seitdem auch nur in der Shell ausführen:${uscore//_/ }
Ersetzt all_
durch Leerzeichen,(....)
teilt den String in ein Array,${arr[@]^}
konvertiert den ersten Buchstaben jedes Elements in Großbuchstaben undprintf %s ..
druckt dann alle Elemente nacheinander.Sie können die Zeichenfolge mit dem Kamel in einer anderen Variablen speichern:
und später verwenden / wiederverwenden, zB:
Oder mit
zsh
:(${(s:_:)uscore})
Teilt den String_
in ein Array auf,(C)
schreibt den ersten Buchstaben jedes Elements in Großbuchstaben undprintf %s ...
druckt alle Elemente nacheinander aus.Um ihn in einer anderen Variablen zu speichern, können Sie
(j::)
die Elemente verbinden:und später verwenden / wiederverwenden:
quelle
Hier ist ein Perl-Weg:
Es kann mit Strings beliebiger Länge umgehen:
Es stimmt mit jedem Zeichen (
.
) überein , das nach dem Anfang der Zeichenfolge oder einem Unterstrich ((^|_)
) steht, und ersetzt es durch die Großbuchstabenversion von sich selbst (uc($&)
). Dies$&
ist eine spezielle Variable, die alles enthält, was gerade abgeglichen wurde. Dase
am Ende vons///ge
erlaubt die Verwendung von Ausdrücken (uc()
in diesem Fall die Funktion) innerhalb der Ersetzung undg
bewirkt, dass alle Vorkommen in der Zeile ersetzt werden. Die zweite Ersetzung entfernt die Unterstriche.quelle
perl -pe 's/(^|_)([a-z])/uc($2)/ge'
Es ist nicht erforderlich, die gesamte Zeichenfolge in einer Übereinstimmung mit regulären Ausdrücken darzustellen. Sed verfügt über den
/g
Modifikator, mit dem Sie mehrere Übereinstimmungen durchgehen und jede ersetzen können:Der erste reguläre Ausdruck ist
_\([a-z]\)
- jeder Buchstabe nach dem Unterstrich; der zweite stimmt mit dem ersten Buchstaben in einer Zeichenfolge überein.quelle
Ich habe diese Antwort nur eingegeben, weil sie kürzer und einfacher ist als alle anderen bisher.
Es heißt: Großbuchstaben, das Zeichen nach einem
_
oder dem Start. Nichtbuchstaben werden nicht geändert, da sie keine Groß- und Kleinschreibung haben.quelle
FooBar
aber der Unterstrich sollte gemäß Anleitung entfernt werden. Da verstehe ich die Anleitung trotzdem._
) angegebene Wortumbrüche stattdessen durch Übergänge in Groß- und Kleinschreibung angezeigt werden. Angesichts dessen ist "FOO_BAR" → "FOOBAR" eindeutig falsch (da die Wortumbruchinformationen verworfen werden), obwohl "FOO_BAR" → "FooBar" möglicherweise korrekt ist. (4) Ebenso scheint eine Abbildung, die Kollisionen verursacht, dem Sinn der Frage zu widersprechen. Ich glaube beispielsweise, dass eine Antwort, die "DO_SPORTS" und "DOS_PORTS" in dasselbe Ziel konvertiert, falsch ist.In Perl:
Dies ist auch nicht möglich:
quelle
Ich habe es so gemacht:
und habe folgendes Ergebnis:
quelle