我发誓,有一天我要学习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)
等
成为
somethingHere
,somethingElseHere
等
现在我得到了:
something_here
,something_else_here
等
答案 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'
我知道sed
和awk
在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