我正在尝试将一些代码从旧命名方案迁移到旧命名方案的新代码:
int some_var_name;
Run Code Online (Sandbox Code Playgroud)
新的是
int someVarName_:
Run Code Online (Sandbox Code Playgroud)
所以我想要的是某种形式的sed/regexy善良来简化这个过程.所以基本上需要发生的是:
找到包含_的小写单词_替换下划线没有任何东西,并将_的右侧的字符串提升为大写.在此之后将_追加到比赛结束.
用Sed和/或Awk和正则表达式可以做到这一点吗?如果不是为什么不呢?
任何示例脚本将不胜感激.
非常感谢任何帮助.
编辑:
为了清楚起见,重命名是针对许多使用错误的命名约定编写的文件,需要与代码库的其余部分保持一致.预计这不是一个完美的替代,使一切处于可编辑的状态.相反,脚本将被运行,然后手动查看任何异常.替换脚本纯粹是为了减轻手动纠正所有内容的负担,我相信你会同意这是相当繁琐的.
sed -re 's,[a-z]+(_[a-z]+)+,&_,g' -e 's,_([a-z]),\u\1,g'
说明:
这是一个带有2个表达式的sed命令(每个表达式都用-e。引起来)s,,,g是全局替换。您通常使用斜杠而不是逗号来查看它,但是当您在模式中使用反斜杠(并且不使用逗号)时,我认为这更容易阅读。尾随的g(表示“全局”)意味着将这种替换应用于每行的所有匹配项,而不仅仅是第一行。
第一个表达式将在由小写字母([a-z]+)组成的每个标记后附加下划线,后跟由下划线((_[a-z]+)+)分隔的非零数量的小写字母。我们将其替换为&_,其中的&意思是“所有符合条件的内容”,而_只是一个下划线。因此,总的来说,该表达式是在每个underscore_separated_lowercase_token的末尾添加一个下划线。
第二个表达式匹配模式_([a-z])),其中(和之间的所有内容)都是一个捕获组。这意味着我们以后可以引用它\1(因为它是第一个捕获组。如果有更多捕获组,它们将是\2,\3等等)。因此,我们要在下划线后匹配一个小写字母,并记住该字母。
我们\u\1用来代替它,这是我们刚刚记得的字母,但是用那个字母大写了\u。
这段代码没有做任何聪明的事情来避免干扰#include线等。它会将下划线后的小写字母的每个实例替换为大写字母。