【问题标题】:Convert regex capturing group from uppercase underscore to camel case将正则表达式捕获组从大写下划线转换为驼峰式
【发布时间】:2013-12-11 20:30:16
【问题描述】:

我发誓,这几天我要去学习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

【问题讨论】:

  • sed 只有 3 个您应该使用的命令 - s、g 和 p(带 -n),因此非常容易学习。如果您发现自己正在考虑使用任何其他构造,请帮自己一个忙,使用 awk。
  • 您是要提取这些字符串还是就地更改它们?我的意思是你想要的输出真的只是someThingHere 还是实际上是NSLocalizedString(@"someThingHere", nil)?脚本如何判断“SOMETHING”应该变成“someThing”(即大写字母“T”中间词)?
  • @EdMorton ups,这是一个错字,已更新,抱歉!
  • 而输出真的只是那些选定的字符串而不是整行?
  • 鉴于您的明确要求,请查看我的更新答案。

标签: regex sed awk grep


【解决方案1】:

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

顺便说一句,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

【讨论】:

  • 感谢您的回答。但是,这会将 any 大写转换为驼峰式。我正在寻找的是仅替换我以前的正则表达式中的捕获组:NSLocalizedString\(\@"(.*)", nil\) 我将更新我的答案以更清晰
  • @ValentinRadu 你能粘贴一个完整的输入行作为例子吗?如果你有 gnu sed,它可以做到这一点。但 awk 可能会更简单。
  • 更新了我的问题。我希望能够避免一天的辛苦劳动(手动替换所有字符串):) 最坏的情况,我将编写一个 python 脚本,但是,我很想在 sed/grep/awk 中进行。
  • 我看到这个答案被接受了。 replace only the capturing group from my previous regex: NSLocalizedString\(\@"(.*)", nil\) 的要求发生了什么?
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2020-01-08
    • 2016-07-30
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多