我试图只使用Shell脚本将字符串的第一个字母更改为小写。理想情况下,从CamelCase到lowerCamelCase的简单方法。
目标:
$DIR="SomeString"
# missing step
$echo $DIR
someString
我找到了一些great resources for doing this to the entire string,但不只是改变了第一个字母而且保留了剩下的字符串。
答案 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
开始修剪第一次出现的模式,?
匹配单个模式
字符。