Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用POSIX外壳将CamelCase转换为lowerCamelCase_Bash_Shell_Posix - Fatal编程技术网

Bash 使用POSIX外壳将CamelCase转换为lowerCamelCase

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

我试图使用Shell脚本将字符串的第一个字母改为小写。理想情况下,这是一种从骆驼箱到低骆驼箱的简单方法

目标:

我发现了一些,但不仅仅是修改了第一个字母并保留了未触及的剩余字符串。

使用sed:

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