![将下划线转换为 PascalCase,即 UpperCamelCase](https://linux22.com/image/63012/%E5%B0%86%E4%B8%8B%E5%88%92%E7%BA%BF%E8%BD%AC%E6%8D%A2%E4%B8%BA%20PascalCase%EF%BC%8C%E5%8D%B3%20UpperCamelCase.png)
如果我有一个看起来像这样的字符串:
"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]\)
-- 下划线后的每个字母;第二个匹配字符串中的第一个字母。