首页 > 解决方案 > Sed 将下划线字符串转换为 CamelCase 在数字上失败

问题描述

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

我想到了 sed 命令,它工作得相当好,除了它在下划线之间的一位数上失败:

命令:

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

它能做什么:

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

先感谢您。

标签: bashshellsedreplacescripting

解决方案


手动循环并更换,直到没有更多可更换的东西。

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


推荐阅读