CamelCase 단어의 독립 실행형 요소

CamelCase 단어의 독립 실행형 요소

텍스트의 "내부" 단어 경계에서 camelCase 단어를 분할하는 방법이 있습니까?

예를 들어, 다음과 같은 문자열이 있습니다.

IamHelloTest forYou PickTest; 

입력으로 출력으로 생성하고 싶습니다.

Iam
Hello
Test
for
You
Pick
Test

고쳐 쓰다:이제 이 질문에 대한 유용한 답변이 많이 있으므로 다음 사례를 어떻게 포함해야 합니까?

입력하다:

IamTestECHO TEST PickFoo BARFull;

원하는 출력:

I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL

고쳐 쓰다:밑줄을 계속 포함하려면 어떻게 해야 합니까?

입력하다:

IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;

원하는 출력:

I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two

답변1

grep구현이 이를 지원하는 경우 -o(그리고 개방형 구현이 아닌 경우 -o빈 문자열과 일치하는 정규식을 차단합니다):

grep -o '[[:upper:]]*[[:lower:]]*'

답변2

유니코드 문자 속성과 너비가 0인 어설션을 사용하여 GNU grep을 통해:

grep -Po '((?<!=\p{Lu})\p{Lu}|(?<!=\pL)\pL)\p{Ll}*'

$ echo 'IamHelloTest forYou PickTest;' | grep -Po '((?<!=\p{Lu})\p{Lu}|(?<!=\pL)\pL)\p{Ll}*'
Iam
Hello
Test
for
You
Pick
Test
$ echo 'АямГеллоТест форЮ ПикТест' | grep -Po '((?<!=\p{Lu})\p{Lu}|(?<!=\pL)\pL)\p{Ll}*'
Аям
Гелло
Тест
фор
Ю
Пик
Тест

답변3

두 번째 예를 처리하려면 보다 "규칙 기반" 접근 방식이 권장됩니다. 다음 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                                     # 
  • 1행: 유니코드 사용(악센트가 있는 키릴 문자 처리)
  • 2행: 문자가 아닌 문자를 "\n"으로 바꿉니다.
  • 3, 4, 5행: break-intraWord 규칙(왼쪽 컨텍스트, 오른쪽 컨텍스트로 정의됨)
  • 5행: "Iam"에 대한 예외
  • 5행: x정규식에 주석을 추가하는 옵션

일반적으로 chmod +x camelcaseproc다음과 같이 사용할 수 있습니다.

$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"
I-am-Test-ECHO-TEST-Pick-Foo-BAR-Full

$ camelcaseproc input-file

$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc

답변4

그리고 sed:

sed -Ee 's/([a-z])([A-Z])/\1\n\2/g' < your_file

그리고 grep:

grep -Eo '[A-Z][a-z]+' < your_file

관련 정보