bash - Sed 将下划线字符串转换为 CamelCase 在数字上失败
问题描述
我有一个将这样编写的函数名称转换为函数名称的分配: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:]]) 。它们的工作方式相同。
先感谢您。
解决方案
手动循环并更换,直到没有更多可更换的东西。
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
。
推荐阅读
- c# - 使用 C# 将字体大小应用于 iTextsharp PDF 窗体时出错
- security - CASB反向代理的技术概念
- python - 如何稳定机器学习模型?
- apache-spark - 优化两个大型 pyspark 数据帧的连接
- php - 柬埔寨字母在交货单上的问题
- typescript - 如何检查 Google Play 订阅是否在客户端或服务器端处于活动状态
- algorithm - 如何在一维中找到一组唯一的最近点对?
- react-native - 当我在 aws-amplify-react-native 中从一个屏幕导航到另一个屏幕时获取“无当前用户”
- java - 在 onAdClosed() 方法中调用片段
- django - 错误:找不到满足 django>=2.0 要求的版本