使用POSIX Shell将CamelCase转换为lowerCamelCase

时间:2014-09-04 21:38:33

标签: bash shell posix

我试图只使用Shell脚本将字符串的第一个字母更改为小写。理想情况下,从CamelCase到lowerCamelCase的简单方法。

目标:

$DIR="SomeString"
# missing step
$echo $DIR
someString

我找到了一些great resources for doing this to the entire string,但不只是改变了第一个字母而且保留了剩下的字符串。

6 个答案:

答案 0 :(得分:7)

如果你的shell足够新,你可以使用以下参数扩展:

DIR="SomeString"   # Note the missing dollar sign.
echo ${DIR,}

答案 1 :(得分:4)

替代解决方案(也适用于旧的bash)

DIR="SomeString"
echo $(echo ${DIR:0:1} | tr "[A-Z]" "[a-z]")${DIR:1}

打印

someString

用于辅助变量

DIR2="$(echo ${DIR:0:1} | tr "[A-Z]" "[a-z]")${DIR:1}"
echo $DIR2

打印

someString

替代perl

DIR3=$(echo SomeString | perl -ple 's/(.)/\l$1/')
DIR3=$(echo SomeString | perl -nle 'print lcfirst')
DIR3=$(echo "$DIR"     | perl -ple 's/.*/lcfirst/e'

一些可怕的解决方案;

DIR4=$(echo "$DIR" | sed 's/^\(.\).*/\1/' | tr "[A-Z]" "[a-z]")$(echo "$DIR" | sed 's/^.//')
DIR5=$(echo "$DIR" | cut -c1 | tr '[[:upper:]]' '[[:lower:]]')$(echo "$DIR" | cut -c2-)

以上所有内容均使用OSX的/bin/bash进行测试。

答案 2 :(得分:3)

使用sed:

var="SomeString"
echo $var | sed 's/^./\L&/'

^表示该行的开头 \L是以小写形式进行匹配的命令 &是整场比赛

答案 3 :(得分:2)

Perl解决方案:

DIR=SomeString
perl -le 'print lcfirst shift' "$DIR"

答案 4 :(得分:2)

由于awk还没有被提及,所以你可以采用另一种方式(需要GNU awk):

dir="SomeString"
new_dir=$(awk 'BEGIN{FS=OFS=""}{$1=tolower($1)}1' <<<"$dir")

这会将输入和输出字段分隔符设置为空字符串,因此每个字符都是一个字段。 tolower函数执行您认为的功能。最后1打印出该行。如果您的shell不支持<<<,则可以改为echo "$dir" | awk ...

答案 5 :(得分:-1)

如果您正在寻找符合POSIX标准的解决方案,请查看typeset

var='SomeString'
typeset -lL1 b="$var"
echo "${b}${var#?}"

输出:

someString

typeset命令创建一个小写,左对齐和一个char长的特殊变量。 ${var#?}$var开始修剪第一次出现的模式,?匹配单个模式 字符。