如何用Shell单行命令生成含CamelCase变量名的变量列表
单行Shell命令实现变量列表生成
需求
用单行Shell命令处理输入文本,生成符合以下规则的变量列表:
- 每个条目格式:
变量名.$ : "原值" - 变量名规则:先去除字符串开头的
/、.、-字符,再将剩余内容按/、.、-拆分,每个拆分后的部分首字母大写,拼接成无分隔符的CamelCase格式 - 原值:完全保留输入行的原始内容
输入示例
auto-scaling/v2/HorizontalPodAutoscaler v1/Service apiextensions.k8s.io/v1/CustomResourceDefinition
预期输出
AutoScalingV2HorizontalPodAutoscaler.$ : "auto-scaling/v2/HorizontalPodAutoscaler" V1Service.$ : "v1/Service" ApiextensionsK8sIoV1CustomResourceDefinition.$ : "apiextensions.k8s.io/v1/CustomResourceDefinition"
解决方案
方案1:使用awk实现(逻辑清晰易维护)
单行命令:
awk '{orig=$0; sub(/^[-./]+/, "", orig); split(orig, parts, /[-./]/); var=""; for(i=1; i<=length(parts); i++){part=parts[i]; var=var toupper(substr(part,1,1)) substr(part,2)}; print var ".$ : \"" $0 "\""}'
命令解释
orig=$0:保存当前行的原始内容,用于后续输出原值sub(/^[-./]+/, "", orig):移除字符串开头的所有-、.、/字符split(orig, parts, /[-./]/):用-、.、/作为分隔符,将处理后的字符串拆分为数组parts- 循环遍历数组,将每个元素的首字母转为大写后拼接,生成最终的变量名
print var ".$ : \"" $0 "\"":按照要求的格式拼接变量名和原始值并输出
方案2:使用sed实现(纯文本处理更简洁)
单行命令:
sed -r 'h; s/(^|[-_/\.]+)([0-9a-z])/\U\2/g; s/[-_/\.]+//g; G; s/(.*)\n(.*)/\1.$ : "\2"/'
命令解释
h:将当前行内容存入sed的临时缓存区(hold space)s/(^|[-_/\.]+)([0-9a-z])/\U\2/g:将所有分隔符(-、_、/、.)后的小写字母转为大写s/[-_/\.]+//g:移除所有剩余的分隔符,得到纯CamelCase格式的变量名G:将缓存区中保存的原始行内容追加到当前处理后的内容后s/(.*)\n(.*)/\1.$ : "\2"/:将两部分内容拼接为需求的输出格式
测试验证
将输入示例保存为input.txt,运行任意一个命令:
# awk版本 awk '{orig=$0; sub(/^[-./]+/, "", orig); split(orig, parts, /[-./]/); var=""; for(i=1; i<=length(parts); i++){part=parts[i]; var=var toupper(substr(part,1,1)) substr(part,2)}; print var ".$ : \"" $0 "\""}' input.txt # sed版本 sed -r 'h; s/(^|[-_/\.]+)([0-9a-z])/\U\2/g; s/[-_/\.]+//g; G; s/(.*)\n(.*)/\1.$ : "\2"/' input.txt
均可得到与预期一致的输出结果。
内容的提问来源于stack exchange,提问作者TheCodeKiller
相关产品推荐
相关产品推荐

