C'è un modo per dividere le parole CamelCase ai limiti delle parole "interne" in un testo?
Ad esempio, data la stringa:
IamHelloTest forYou PickTest;
come input, vorrei produrre come output:
Iam
Hello
Test
for
You
Pick
Test
Aggiornamento: ora che la domanda ha molte risposte utili, come potrei procedere per includere anche i seguenti casi?
Inserimento:
IamTestECHO TEST PickFoo BARFull;
Uscita desiderata:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
Aggiornamento: come dovrei procedere per includere anche il trattino basso?
Inserimento:
IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;
Uscita desiderata:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two
Risposta accettata:
Per affrontare il tuo secondo esempio, suggerisci un approccio più "basato su regole".
Considera il seguente script Perl (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 #
- Riga 1:usa Unicode (per elaborare gli accenti, cirillico)
- Riga 2:sostituisci le non lettere con "\n"
- riga 3,4,5:regole di break-intraWord (definite da contesto a sinistra, contesto a destra)
- riga 5:regole di eccezione per "Iam"
- riga 5:
x
opzione rende possibile aggiungere commenti in espressioni regolari
Dopo il solito chmod +x camelcaseproc
possiamo usarlo come:
$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"
I-am-Test-ECHO-TEST-Pick-Foo-BAR-Full
$ camelcaseproc input-file
$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc