텍스트의 "내부" 단어 경계에서 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