2013-12-11 34 views
1

其中一天我要學習sed,我發誓。 現在,對於這個問題:將正則表達式捕獲組從大寫字母下劃線轉換爲駝色案例

我試圖從大寫下劃線(MY_EXAMPLE)到駝峯案例(myExample)取代正則表達式的捕獲組。

不幸的是,我的sed的知識是非常有限的,這是我到目前爲止有:

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

這種轉換MY_EXAMPLE到my_example,關閉,排序的,但並不完全。所以,我現在面臨的問題是,因爲駱駝案例更換本身就是一個正則表達式,我如何才能將該正則表達式應用於捕獲組(\ 1)?使用grep或awk可以輕鬆完成嗎?

UPDATE:

爲了使它更清楚,我在尋找什麼是後每構建這樣的:

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

成爲

somethingHeresomethingElseHere

現在我得到了:

something_here,something_else_here etc

+0

只有戰略經濟對話你是否應該使用3個命令 - S,G,和P(帶-n),所以它很容易學習。如果你發現自己正在考慮使用任何其他構造,請自己幫忙,並使用awk。 –

+0

你正在尋找提取這些字符串還是就地更改它們?我的意思是你想要的輸出真的只是'someThingHere'或者它實際上'NSLocalizedString(@「someThingHere」,零)'?一個劇本如何能夠告訴「SOMETHING」應該變成「someThing」(即在字母中間大寫字母「T」)? –

+0

@EdMorton ups,這是一個錯字,更新,對不起! –

回答

3

sed是好的。在這裏你去:

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中更新答案。

btw,gnu awk。

測試你的榜樣:

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可以粘貼一個完整的輸入行爲例子?如果你有牛磺酸,它可以做到這一點。但awk可能會做得更簡單。 – Kent

+0

更新了我的問題。我希望有可能,以避免勞累的一天(手動替換所有的字符串):)最糟糕的情況下,我會寫一個python腳本,但是,我希望在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 
相關問題