sed将下划线字符串转换为CamelCase的数字失败

时间:2019-10-14 14:37:40

标签: bash shell sed replace scripting

我有一个转换将这样编写的函数名转换为: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:]])。他们工作相同。

先谢谢您。

1 个答案:

答案 0 :(得分:0)

手动遍历它,然后进行替换,直到没有其他要替换的为止。

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