我正在使用 bash shell。我曾用它将字符串从蛇形命名法转换为驼峰命名法...
$ echo "this_is_the_string" | sed -r 's/(^|_)([a-z])/\U\2/g'
ThisIsTheString
但是,如果我想保留第一个字母小写怎么办?也就是说,我希望“this_is_the_string”转换为
thisIsTheString
答案1
做就是了:
$ echo "this_is_the_string" | sed -E 's/_([a-z])/\U\1/g'
thisIsTheString
答案2
和zsh
:
$ string=this_is_the_string
$ set -o extendedglob
$ print -r -- ${string//(#b)_(?)/$match[1]:u}
thisIsTheString
不限于拉丁/罗马,更不用说 ASCII 字母,并且还会删除_
非字母前面的:
$ string=pi_aka_π_is_3dot14_and_a_Bit
$ print -r -- ${string//(#b)_(?)/$match[1]:u}
piAkaΠIs3dot14AndABit
如果您的字符串包含两个或多个_
s 的序列,您可能需要根据您想要对它们执行的操作进行调整。
可移植地使用 POSIX 实用程序,您可以执行以下操作:
awk -- '
BEGIN {
s = ARGV[1]
while (match(s, "_."))
s = substr(s, 1, RSTART - 1) \
toupper(substr(s, RSTART + 1, 1)) \
substr(s, RSTART + 2)
print s
}' "$string"
(--
POSIX 不需要,但旧版本的 busybox 需要awk
)。
或者使用perl
:
perl -CLAO -le 'print $ARGV[0] =~ s/_(.)/\U$1/gr' -- "$string"
IIRC\U
是80 年代ex
的。包括 GNU 在内的vi
一些sed
实现sed
也支持它,但 POSIXsed
规范中没有。如果ocale 使用 UTF-8 (输出 UTF-8),-CLAO
则将A
参数视为 UTF-8 并以 UTF-8 输出,将使用用户的区域设置字符,无论它们是什么,甚至在字符串包含字节序列时仍然有效无法用字符解码。与,YMMV。O
L
locale charmap
zsh
awk