CamelCase仅用于使用shell工具的行的某些部分

a7qyws3x  于 2023-11-21  发布在  Shell
关注(0)|答案(3)|浏览(120)

我的目标是有一个一行程序来生成一个由变量名和它的值组成的变量列表。当删除前导斜杠“/”或点“.”或破折号“-”时,value必须保持“as-is”,而变量的name必须是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"


我在stackoverflow中发现了一些线索,可以使用awk或sed在CamelCase中转换完整的字符串,但这些都是针对完整的 * 行 *,而我只会在.$”之前的部分(或者“:“,因为我可以在“.$“部分之后添加)

echo "apiextensions.k8s.io/v1/CustomResourceDefinition" | sed -r 's/(^|[-_/\.]+)([0-9a-z])/\U\2/g'
ApiextensionsK8sIoV1/CustomResourceDefinition

echo "apiextensions.k8s.io/v1/CustomResourceDefinition" | awk 'BEGIN{FS="";RS="[-./]";ORS=""} {$0=toupper(substr($0,1,1)) substr($0,2)} 1'
ApiextensionsK8sIoV1CustomResourceDefinition

cwdobuhd

cwdobuhd1#

您可以使用下面的awk来实现您的目的:

awk 'BEGIN{FS="";RS="[-./]";ORS=""} {$0=toupper(substr($0,1,1)) substr($0,2)} 1'

字符串

以上命令说明:
*BEGIN{FS="";RS="[-./]";ORS=""}-设置分隔符。
*FS=""-字段分隔符(FS)设置为使每个字符表现得像一个单独的字段。
*RS="[-./]"-记录分隔符(RS)设置为匹配[-./]的正则表达式,并根据[-./]进行分隔。您可以根据具体目的添加或删除它们。
*ORS=""-设置输出记录分隔符(ORS)以避免打印新行。
*{toupper(substr($0,1,1))-它将记录的第一个字符转换为字符串,并将其添加到输出中。
*substr($0,2)-将输入的其余部分转换为输出记录。
*1-{print}当前记录的简写。

  • 代码演示 *
rwqw0loc

rwqw0loc2#

使用任何awk:

$ awk -F '[-/.]' -v OFS='.$ : "' -v ORS='"\n' '{
    name = ""
    for (i=1; i<=NF; i++) {
        name = name toupper(substr($i,1,1)) substr($i,2)
    }
    print name, $0
}' file
AutoScalingV2HorizontalPodAutoscaler.$ : "auto-scaling/v2/HorizontalPodAutoscaler"
V1Service.$ : "v1/Service"
ApiextensionsK8sIoV1CustomResourceDefinition.$ : "apiextensions.k8s.io/v1/CustomResourceDefinition"

字符串

zd287kbt

zd287kbt3#

这可能对你有用(GNU sed):

sed -E 'h;s/\b./\U&/g;s/[[:punct:]]//g;G;s/\n(.*)/.$ : "\1"/' file

字符串
复印一份。
CamelCase变量。
添加副本。
产生所需的输出。

相关问题