Gibt es eine Möglichkeit, CamelCase-Wörter an den „inneren“ Wortgrenzen in einem Text zu trennen?
Zum Beispiel angesichts der Zeichenfolge:
IamHelloTest forYou PickTest;
Als Input möchte ich als Output erzeugen:
Iam
Hello
Test
for
You
Pick
Test
Aktualisierung: Nun, da die Frage viele hilfreiche Antworten hat, wie würde ich vorgehen, um auch die folgenden Fälle einzubeziehen?
Eingabe:
IamTestECHO TEST PickFoo BARFull;
Gewünschte Ausgabe:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
Aktualisierung: Wie würde ich vorgehen, um auch den Unterstrich einzufügen?
Eingabe:
IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;
Gewünschte Ausgabe:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two
Akzeptierte Antwort:
Um mit Ihrem zweiten Beispiel umzugehen, schlagen Sie einen eher „regelbasierten“ Ansatz vor.
Betrachten Sie das folgende Perl-Skript (camelcaseproc
):
#!/usr/bin/perl -CSDA -p
s{ \W+ # break on non-word
| _ # break on "_"
| (?<=\p{Ll})(?=\p{Lu}) # ...aB... → ...a-B...
| (?<=\p{Lu})(?=\p{Lu}\p{Ll}) # ..ABCd.. → ...AB-Cd.
| (?<=I)(?=am) # exceptions rules
}{-}xg #
- Zeile 1:Unicode verwenden (um Akzente zu verarbeiten, Kyrillisch)
- Zeile 2:Ersetzen Sie Nicht-Buchstaben durch „\n“
- Zeile 3,4,5:Break-intraWord-Regeln (definiert durch linken Kontext, rechten Kontext)
- Zeile 5:Ausnahmeregeln für „Iam“
- Zeile 5:
x
Option ermöglicht das Hinzufügen von Kommentaren in regulären Ausdrücken
Nach dem üblichen chmod +x camelcaseproc
wir können es verwenden als:
$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"
I-am-Test-ECHO-TEST-Pick-Foo-BAR-Full
$ camelcaseproc input-file
$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc