将下划线转换为 PascalCase,即 UpperCamelCase

将下划线转换为 PascalCase,即 UpperCamelCase

如果我有一个看起来像这样的字符串:

"this_is_the_string"

在 bash 脚本中,我想将其转换为 PascalCase,即 UpperCamelCase,如下所示:

"ThisIsTheString"

我发现转换为 lowerCamelCase 可以这样完成:

"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'

不幸的是我对正则表达式不够熟悉来修改它。

答案1

$ echo "this_is_the_string" | sed -r 's/(^|_)([a-z])/\U\2/g'            
ThisIsTheString


(^|_)在字符串开头或下划线之后替换模式- 第一组
([a-z])单个小写字母 - 第二组全局
大写
\U\2第二组
g

答案2

由于您正在使用bash,如果您将字符串存储在变量中,您也可以仅在 shell 中执行此操作:

uscore="this_is_the_string_to_be_converted"
arr=(${uscore//_/ })
printf %s "${arr[@]^}"
ThisIsTheStringToBeConverted

${uscore//_/ }将全部替换_为空格,(....)将字符串拆分为数组,${arr[@]^}将每个元素的第一个字母转换为大写,然后printf %s ..依次打印所有元素。
您可以将驼峰式字符串存储到另一个变量中:

printf -v ccase %s "${arr[@]^}"

并稍后使用/重用它,例如:

printf %s\\n $ccase
ThisIsTheStringToBeConverted

或者,与zsh

uscore="this_is_the_string_to_be_converted"
arr=(${(s:_:)uscore})
printf %s "${(C)arr}"
ThisIsTheStringToBeConverted

(${(s:_:)uscore})将字符串拆分_为一个数组,(C)将每个元素的第一个字母大写并printf %s ...依次打印所有元素。
要将其存储在另一个变量中,您可以使用(j::)连接元素:

ccase=${(j::)${(C)arr}}

并稍后使用/重用它:

printf %s\\n $ccase
ThisIsTheStringToBeConverted

答案3

这是 Perl 的方式:

$ echo "this_is_the_string" | perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
ThisIsTheString

它可以处理任意长度的字符串:

$ echo "here_is_another_larger_string_with_more_parts" | 
    perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
HereIsAnotherLargerStringWithMoreParts

它将匹配.字符串开头或下划线 ( (^|_)) 之后的任何字符 ( ),并将其替换为其自身的大写版本 ( uc($&))。这$&是一个特殊变量,包含刚刚匹配的内容。末尾e的允许在替换中s///ge使用表达式(本例中为函数),并且使其替换uc()g全部行中出现的情况。第二次替换删除了下划线。

答案4

没有必要代表全部的正则表达式匹配中的字符串 - sed 具有/g允许您遍历多个匹配项并替换每个匹配项的修饰符:

echo "this_is_the_string" | sed 's/_\([a-z]\)/\U\1/g;s/^\([a-z]\)/\U\1/g'

第一个正则表达式是_\([a-z]\)-- 下划线后的每个字母;第二个匹配字符串中的第一个字母。

相关内容