将正则表达式捕获组从大写下划线转换为驼峰大小写

时间:2013-12-11 20:30:16

标签: regex sed awk grep

我发誓,有一天我要学习sed。 现在,问题是:

我正在尝试将正则表达式的捕获组从大写下划线(MY_EXAMPLE)替换为驼峰大小写(myExample)。

不幸的是,我的sed知识非常有限,这是我到目前为止所做的:

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

这会将MY_EXAMPLE转换为my_example,关闭,排序,但不完全。所以,我现在面临的问题是,因为驼峰式替换本身就是一个正则表达式,我如何将该正则表达式应用于捕获组(\ 1)?使用grep或awk更容易完成吗?

更新:

为了更清楚,我正在照顾的是每一个这样的结构:

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

成为

somethingHeresomethingElseHere

现在我得到了:

something_heresomething_else_here

2 个答案:

答案 0 :(得分: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行肯定。但是在awk中,sed的管道保存了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

答案 1 :(得分: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