Bash 使用POSIX外壳将CamelCase转换为lowerCamelCase
我试图使用Shell脚本将字符串的第一个字母改为小写。理想情况下,这是一种从骆驼箱到低骆驼箱的简单方法 目标: 我发现了一些,但不仅仅是修改了第一个字母并保留了未触及的剩余字符串。使用sed:Bash 使用POSIX外壳将CamelCase转换为lowerCamelCase,bash,shell,posix,Bash,Shell,Posix,我试图使用Shell脚本将字符串的第一个字母改为小写。理想情况下,这是一种从骆驼箱到低骆驼箱的简单方法 目标: 我发现了一些,但不仅仅是修改了第一个字母并保留了未触及的剩余字符串。使用sed: var="SomeString" echo $var | sed 's/^./\L&/' ^表示行的开始 \L是以小写字母进行匹配的命令 &是全部匹配如果您的shell足够新,您可以使用以下参数展开: DIR="SomeString" # Note the missing dollar si
var="SomeString"
echo $var | sed 's/^./\L&/'
^
表示行的开始
\L
是以小写字母进行匹配的命令
&
是全部匹配如果您的shell足够新,您可以使用以下参数展开:
DIR="SomeString" # Note the missing dollar sign.
echo ${DIR,}
Perl解决方案:
DIR=SomeString
perl -le 'print lcfirst shift' "$DIR"
替代解决方案(也适用于旧bash)
印刷品
someString
someString
用于分配变量
DIR2="$(echo ${DIR:0:1} | tr "[A-Z]" "[a-z]")${DIR:1}"
echo $DIR2
印刷品
someString
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
测试的,因为还没有提到awk,这里有另一种方法可以实现(需要GNU awk):
dir=“SomeString”
new_dir=$(awk'BEGIN{FS=OFS=”“}{$1=tolower($1)}1'如果您正在寻找符合POSIX的解决方案,请查看
输出:
typeset
命令创建一个小写、左对齐和一个字符长的特殊变量。${var#?}
从$var
开始修剪第一个出现的模式,并且?
匹配单个字符
字符。感谢您的快速解决方案,很遗憾我使用的是POSIX sed,因此我没有访问\L的权限。请查看您的sed
手册页和re\u格式的手册页。有时,如果您在sed
中使用-E
,它将使用扩展的正则表达式,其中可能包括\L
。您可以因此,请查看可以传递给sed
的其他参数,这些参数可以扩展其正则表达式功能。如果您使用自制软件,您实际上可以在mac上执行此操作:我使用的是OSX,而且默认的Bash似乎不是最近才出现的。我在尝试和使用Bash v4功能时出错:Bash:${DIR,}:糟糕substitution@Infinite是时候看一下了。除了OSX的BSD工具之外,你还可以得到许多好的GNU工具。@jm666谢谢:D我很了解MacPorts和Brew。这是一个需要在各种平台上运行的构建脚本,它是在使用Rake的主构建脚本之外的。首选是使用tr[:upper:][:lower:]
,但对于BASH来说,这是一个很好的解决方案。请让OP知道,这在Mac 3.2版上的BASH中是有效的。您应该更新您的问题,以表明您正在寻找符合POSIX的解决方案。人们不会通过查看注释来判断您是否仍在寻找解决方案。还可以添加操作系统。您的注释表明您正在使用POSIXMac是BSD,不是POSIX投诉。@jaypalsingh编辑,谢谢您的建议。
dir="SomeString"
new_dir=$(awk 'BEGIN{FS=OFS=""}{$1=tolower($1)}1' <<<"$dir")
var='SomeString'
typeset -lL1 b="$var"
echo "${b}${var#?}"
someString