정규식을 활용한 Underscore / Camel Case 전환

2023. 4. 6. 02:44리눅스 실제 사용 팁

작성일 : 2022. 10. 21. 01:07


1. Underscore to Camel Case

찾을 내용 : _(.)

바꿀 내용 : \U$1

 

노트패드++ 에서 통하는 방법이다. 다만, 저 방법을 적용하기 전에 우선 모두 소문자로 변환해야 한다.

그렇게 하지 않으면 요렇게 되지~~ (적용 전 : I_LOVE_SALSA, 적용 후 : ILOVESALSA)

 

선택된 문자열을 모두 소문자로 변환

 

모두 소문자로 변환하면 (전 : I_LOVE_SALSA, 후 : i_love_salsa)

알파벳 소문자인 상태에서 정규식을 적용하면?

 

이렇게 된다.

 

하지만 거치는 과정이 다소 번거롭다. 이런 기능이 플러그인으로 존재한다면 감사히 편리하게 사용할텐데..

 

해설)

() 는 그룹(묶음)이다.

. 은 어느 한 문자 또는 숫자를 의미한다. 따라서 _(.) 는 I_LOVE_SALSA 에서 _L, _S 가 해당된다.

\U 는 뒤에 따라오는 문자를 알파벳 대문자로 변환한다.

$1 은 노트패드++ 에서 앞서 찾아낸 패턴에 해당하는 첫 번째 대상이다. (sed 에서는 \1 임)

 

sed 를 활용하는 방법 :

우선 대문자를 모두 소문자로 변환한다. ([[:alpha:]]) 로 알파벳 전체에 적용해도 된다.

그 다음에는 '_'  뒤에 오는 알파벳만 찾아서 대문자로 변환하면 된다.

 

$ echo I_LOVE_SALSA | sed -E 's/([[:upper:]])/\L\1/g'
[결과] i_love_salsa

$ echo I_LOVE_SALSA | sed -E 's/([[:upper:]])/\L\1/g' | sed -E 's/_(.)\B/\U\1/g'
[결과] iLoveSalsa

 

2. Camel Case to Underscore (Snake case)

아쉽지만 노트패드++ (의 Boost regular expression library) 에서 [[:upper:]] 같은 축약형 연산자를 지원하지 않는다.

그렇다고 그렇게 긴 패턴을 외울 수도 없는 노릇이고! (참고로 Stack Overflow 에서 관련 패턴을 찾을 수 있다)

따라서 리눅스 쉘 환경의 sed 에서 가능한 것만으로도 감사해야 한다. BASH 를 쓸 수 없는 환경이라면? 눈물이 앞을 가린다. 재야의 고수들은 다 방법이 있으리라! 없으면 VO 변수목록이 길 때 한 줄, 한 줄 "_" 를 붙이거나 그냥 DB 클라이언트에서 컬럼을 복사해와서 다시 정렬하거나 그대로 쓸 수 밖에...

 

찾을 내용 패턴 : \B([[:upper:]])
바꿀 내용 : _\U\1


해설)

\B 를 설명하기에 앞서 소문자 \b 를 먼저 설명하겠다. \b 는 (backspace 로 알고 있었으나 그게 아니고) boundary (경계) 를 의미한다. 경계에 붙어 있는 empty string(길이가 0인 문자열) 으로 표현하기도 한다.

 

대문자 \B 는 \b 의 반대이다. \B(패턴) 의 결과는 (패턴) 앞의 empty string 이다.

 

\U 는 뒤에 따라오는 문자를 uppercase, 즉 대문자로 변환한다.

\1 는 앞서 실행한 패턴에 해당하는 첫 번째 대상이다. sed 에서 sed 's/(패턴)/\U\1/' 을 실행하면 첫 번째 대상만 변경이 되는데 뒤에 global 을 의미하는 g 를 붙이면 패턴을 반복해서 적용할 수 있다. sed 's/(패턴)/\U\1/g'

 

sed 를 활용한 사용방법 :

CamelCase 에서 Snake case 로 변환할 때 알파벳 대문자를 기준으로 앞에 "_" 를 붙이기 때문에

뒤에 따라오는 문자들은 대문자로 변환되지 않고 소문자로 남는다.

따라서 파이프를 통해서 sed 에서 다시 전체를 대문자로 변환시키는 작업을 한 번 더 해주어야 한다.

 

$ echo iLoveSalsa | sed -E 's/\B([[:upper:]])/_\1/g'
[결과] i_Love_Salsa

$ echo ILoveSalsa | sed -E 's/\B([[:upper:]])/_\1/g' | sed -E 's/([a-zA-Z].*)/\U\1/g'
[결과] I_LOVE_SALSA

또는

$ echo ILoveSalsa | sed -E 's/\B([[:upper:]])/_\1/g' | sed -E 's/([[:alpha:]].*)/\U\1/g'
[결과] I_LOVE_SALSA

 

camel_to_snake.sh
0.00MB
snake_to_camel.sh
0.00MB