【问题标题】:Sed converting underscore string to CamelCase fails on numbersSed 将下划线字符串转换为 CamelCase 在数字上失败
【发布时间】:2020-02-11 05:03:25
【问题描述】:

我有一个将这样编写的函数名称转换为函数名称的任务:function_name() 到 camelCase。有一些限制:

  • 不要转换包含大写字符的函数
  • 不要转换带有两个下划线的部分函数 (two__underscores())

我认为 sed 命令效果很好,除了它在下划线之间的单个数字上失败:

命令:

sed -re '/[A-Z]+/!s/([0-9a-z])(_)([a-z0-9])/\1\u\3/g'

它的作用:

  • this_is_simple() -> thisIsSimple()
  • this_is_2_simple() -> thisIs2_simple()
  • this_is_22_simple() -> thisIs22Simple()

问题是第二个例子。为什么它在单个数字上失败,而不是在更多数字上失败?我尝试使用 [[:digit:]] 并将 ([0-9a-z]) 替换为 ([a-z0-9]|[[:digit:]]) 。它们的工作方式相同。

提前谢谢你。

【问题讨论】:

  • 好的,我明白了,非常感谢。但我仍然不知道如何纠正它。你有什么建议吗?
  • 因为在22 的情况下,第一个2 匹配上一场比赛的最后一组,而下一个2 匹配下一场比赛的第一组。而在单个 2 情况下,第一个匹配 this_is_2 被消耗,其余的 _simple() 不匹配任何内容。编号并不特殊,例如。 this_is_a_simple 也会失败,任何只有一个字符的东西。

标签: bash shell sed replace scripting


【解决方案1】:

手动循环并替换,直到没有更多可替换。

sed -re '/[A-Z]+/!{ : again; /([0-9a-zA-Z])_([a-z0-9])/{ s//\1\u\2/; b again; }; }'

我在第一个正则表达式中添加了A-Z 来处理以下情况:

this_is_a_simple -> thisIsASimple

第一次匹配后它变成thisIsA_simple,所以在第二个循环中我们要匹配A_simple

也许更好的版本是:

sed -re '/[A-Z]+/!{ : again; /(.*[0-9a-z])_([a-z0-9])/{ s//\1\u\2/; b again; }; }'

因为正则表达式是贪心的,所以它会从头开始替换,所以this_is_a_simple首先变成this_is_aAimple,然后是this_isASimple,然后是thisIsASimple

【讨论】:

  • 非常感谢!这解决了我的问题。 :) 你对好的 sed 教程有什么建议吗?我还没有看到:再次;之前循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多