2013-12-11 2 views
1

요즘 저는 sed을 배우려고합니다. 질문 :정규 표현식 캡쳐 그룹을 대문자 밑줄에서 낙타 대문자로 변환하십시오.

정규식의 캡쳐 그룹을 대문자 밑줄 (MY_EXAMPLE)에서 카멜 케이스 (myExample)로 바꿉니다.

불행하게도, 내 나오지 지식이 거의 이것이 내가 지금까지 무엇을 가지고, 제한 :이 아니지만 꽤 MY_EXAMPLE 일종의 가까이, my_example로 변환

cat Labels.h | gsed -E 's/NSLocalizedString\(\@"(.*)", nil\)/\L\1/'

. 그래서, 지금 직면하고있는 문제는, 낙타의 경우 대체 자체가 정규식이기 때문에 어떻게 그 정규식을 캡처 그룹 (\ 1)에 적용 할 수 있습니까? grep이나 awk로 쉽게 할 수 있습니까?

UPDATE :

은 내가 후 찾고 있어요 것은 모든이 같은 구성이며, 좀 더 명확하게하려면 :

NSLocalizedString(@"SOMETHING_HERE", nil)NSLocalizedString(@"SOMETHING_ELSE_HERE", nil)는 등

somethingHere, somethingElseHere 등이 될

이제 알겠습니다.

something_here, something_else_here

+0

은 사용 이제까지해야 3 명령이 있습니다. 다른 구조체를 사용하는 것을 고려하고 있다면, awk를 사용하십시오. –

+0

해당 문자열을 추출하거나 내부에서 변경하려고하십니까? 내가 원하는 출력은 실제로'someThingHere'이거나 실제로'NSLocalizedString (@ "someThingHere", nil)'입니까? '뭔가'가 "someThing"이되어야한다고 (예 : 문자 "T"중간 단어를 대문자로) 스크립트에서 알릴 수 있습니까? –

+0

@EdMorton ups, 오타, 업데이트 됨, 미안 해요! –

답변

3

나오지도 괜찮습니다. 여기 당신은 간다 :

kent$ echo 'FOO_BAR 
MY_EXAMPLE'|sed -r 's/([A-Z]+)_([A-Z]+)/\L\1\u\2/' 
fooBar 
myExample 

편집

업데이트 된 질문에 대한 하나있다 :

awk -v FPAT='[A-Z]+(_[A-Z]+)+' '$0=tolower($1)' file|sed -r 's/_(.)/\u\1/g' 

내가 sedawk는 99.9 %의 경우에서 함께 작업을 필요로하지 않는다는 것을 알고있다. 그리고 위의 라인은 확실히 하나의 awk 라인으로 작성 될 수 있습니다. 그러나 sed 로의 파이핑은 awk에서 split()/substr()을 저장했습니다. 성능에 문제가 없다면 사용할 수 있습니다.

다른 "어리석은"조합은 grep|sed(or awk)입니다. 필요한 부분을 grep하고 awk/sed로 전달하십시오.

grep -Po '[A-Z]+(_[A-Z]+)+' file 

입니다.

단일 프로세스가 필요한 경우 단일 awk one-liner에서 대답을 업데이트 할 수 있습니다.

btw, gnu awk. 귀하의 예제와

테스트 : - 그것은 매우 쉽게 배울 그래서, S, G, 및 (-n 포함) 페이지에만 나오지

kent$ cat f 
NSLocalizedString(@"SOMETHING_HERE", nil), 
NSLocalizedString(@"SOMETHING_ELSE_HERE", nil) etc 

kent$ awk -v FPAT='[A-Z]+(_[A-Z]+)+' '$0=tolower($1)' f|sed -r 's/_(.)/\u\1/g' 
somethingHere 
somethingElseHere 
+0

답변 해 주셔서 감사합니다. 그러나 이것은 * 대문자를 카멜 케이스로 변환합니다. 내가 찾고있는 것은 이전 정규 표현식의 캡처 그룹 만 바꾸는 것입니다. NSLocalizedString \ (\ @ "(. *)", nil \)'명확하게 대답을 업데이트합니다 –

+0

@ValentinRadu 하나의 완전한 입력 행을 예제로? 당신이 GNU sed를했다면, 그렇게 할 수 있습니다. 하지만 awk가 그렇게 간단하게 할 수 있습니다. – Kent

+0

내 질문이 업데이트되었습니다. 나는 (수동으로 모든 문자열을 교체) 하드 노동의 하루를 피하기 위해 가능할 것으로 기대했다 :) 최악의 시나리오, 나는 파이썬 스크립트를 작성 하겠지만, 나는 sed/grep/awk에서 그것을하고 싶다. –

2
$ cat file 
MY_EXAMPLE 
THIS_IS_ANOTHER_EXAMPLE 
and_YET_ANother 
NSLocalizedString(@"SOMETHING_HERE", nil) 
NSLocalizedString(@"SOMETHING_ELSE_HERE", nil) 

$ cat tst.awk   
BEGIN { fn = "NSLocalizedString(@\""; fnLgth = length(fn) } 

fnStart = index($0,fn) { 

    argStart = fnStart + fnLgth 

    argLgth = index(substr($0,argStart),"\"") - 1 

    arg = tolower(substr($0,argStart,argLgth)) 

    split(arg,argA,/_/) 

    printf "%s", argA[1] 
    for (i=2;i in argA;i++) { 
     printf "%s", toupper(substr(argA[i],1,1)) substr(argA[i],2) 
    } 
    print "" 

} 

$ awk -f tst.awk file 
somethingHere 
somethingElseHere 
관련 문제