Shell sed Capital_案例不起作用
我正在尝试将包含Shell sed Capital_案例不起作用,shell,awk,sed,zsh,Shell,Awk,Sed,Zsh,我正在尝试将包含-(连字符)或(下划线)的字符串转换为大写字母 #/副秘书长/垃圾箱/环境卫生 函数cap_case(){ [$#-eq 1]| |返回1; _str=1美元; _大写=${u str/[-\]/{}sed-E的/(^ | |))([a-zA-Z])/\u\2/g' 回显“大写:” echo$大写 返回0 } 读取字符串 echo$(大写$string) 但我什么也没说出来 首先,我将所有出现的-和替换为-${u str/[--\u]/{u},然后将该字符串传输到sed,该字符
-
(连字符)或
(下划线)的字符串转换为大写字母
#/副秘书长/垃圾箱/环境卫生
函数cap_case(){
[$#-eq 1]| |返回1;
_str=1美元;
_大写=${u str/[-\]/{}sed-E的/(^ | |))([a-zA-Z])/\u\2/g'
回显“大写:”
echo$大写
返回0
}
读取字符串
echo$(大写$string)
但我什么也没说出来
首先,我将所有出现的-
和
替换为-
${u str/[--\u]/{u}
,然后将该字符串传输到sed
,该字符串将第一个字母或-/u
作为第一组,然后将第一组后的字母作为第二组,我想把找到的字母大写为\u\2
。我尝试了\U\2
,但效果不太好
我希望字符串成为某个字符串
Some_String
Some_String
和字符串一些字符串成为
Some_String
Some_String
我在mac电脑上,如果有用的话,可以使用zsh。编辑:更通用的解决方案,使每个字段的首字母大写
echo "some_string_other" | awk -F"_" '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1)) substr($i,2)}} 1' OFS="_"
输出如下
echo "some_string" | awk -F"_" '{$1=toupper(substr($1,1,1)) substr($1,2);$2=toupper(substr($2,1,1)) substr($2,2)} 1' OFS="_"
Some_String
您没有分配给\u capitalize
-您为通过管道传输到sed
的空命令设置了一个\u capitalize
环境变量
你可能是说
_capitalize=$(<<<"${_str//[-_]/_}" sed -E 's/(^|_)([a-zA-Z])/\1\u\2/g')
请注意,替换的\u
/\u
是sed的GNU扩展-如果您使用的是非GNU实现,请检查它是否支持此功能。bash:
#!/bin/bash
camel_case(){
local d display string
declare -a strings # = scope local
[ "$2" ] && d="$2" || d=" " # optional output delimiter
ifs_ini="$IFS"
IFS+='_-' # we keep initial IFS
strings=( "$1" ) # array
for string in ${strings[@]} ; do
display+="${string^}$d"
done
echo "${display%$d}"
IFS="$ifs_ini"
}
camel_case "some-string_here" "_"
camel_case "some-string_here some strings here" "+"
camel_case "some-string_here some strings here"
echo "$BASH_VERSION"
exit
Some_String_Here
Some+String+Here+Some+Strings+Here
Some String Here Some Strings Here
4.4.18(1) release
输出:
#!/bin/bash
camel_case(){
local d display string
declare -a strings # = scope local
[ "$2" ] && d="$2" || d=" " # optional output delimiter
ifs_ini="$IFS"
IFS+='_-' # we keep initial IFS
strings=( "$1" ) # array
for string in ${strings[@]} ; do
display+="${string^}$d"
done
echo "${display%$d}"
IFS="$ifs_ini"
}
camel_case "some-string_here" "_"
camel_case "some-string_here some strings here" "+"
camel_case "some-string_here some strings here"
echo "$BASH_VERSION"
exit
Some_String_Here
Some+String+Here+Some+Strings+Here
Some String Here Some Strings Here
4.4.18(1) release
你可以试试这个gnu
echo 'some_other-string' | sed -E 's/(^.)/\u&/;s/[_-](.)/_\u\1/g'
解释:
s/(^.)/\u&/
(^.)匹配第一个字符,并\u将匹配项用大写字母表示(&u)
s/[_-](.)/_\u\1/g
[-](.)捕获前面带有u或-的字符,并将其替换为u和匹配的大写字符
s/[_-](.)/_\u\1/g
最后的g告诉sed为满足标准的每个字符进行替换这就是zsh
,您不需要sed
(实际上,甚至不需要函数):
(C)
标志将单词大写(其中“单词”定义为由其他字符分隔的字母数字字符序列)<代码>:gs/-/\u
将连字符替换为下划线
如果你真的想要一个函数,它是cap_case(){print${(C)1:gs/-/-/}}
我得到了一些字符串。当我使用它时:/@dingo_d,很抱歉没有得到它,请解释。我添加了你的代码,而不是\u capitalize=${u str/[-.]/\u124; sed-E/([a-zA-Z])/\u\2/g'
capitalized@dingo_d,您正在尝试输入哪个文本?对于某些字符串
它工作正常。工作正常!谢谢我需要看看awk
干杯!试过之后,当我测试一些字符串时,我得到了一些提示。sed似乎也将取代。
。您添加的第二个代码片段只是小写的my字符串。是因为我使用mac OS吗?可能是-您的sed支持\u
?如果没有,您需要确保您使用的是GNU实现(可能称为gsed
?),或者使用其他方法来改变这种情况。如果您使用的是GNU sed,请确保没有通过在环境中设置POSIXLY_CORRECT
将其置于严格模式。您的shell也可能理解\u
和\u
为Unicode字符转义,即使在单引号中也是如此。与POSIX兼容的shell不应该这样做。问题被标记为zsh
,而不是bash
。很抱歉,它已更改,我遵循bash。。。但是bash可以是一个解决方案,不是吗?照目前的情况,代码在zsh
中不起作用,但可能很容易调整。我认为最好在函数结束时恢复IFS。你可以使用本地IFS
-这是一个更简单的选择。不要使用sh
作为你的工具。尽管/bin/sh
实际上是bash
,但当作为sh
调用时,它的行为不同。也就是说,您真的是用sh
或bash
执行脚本,还是用zsh
执行脚本?zsh是一种可能性,而不是强制执行?如果您使用sh
(甚至是/test.sh
)和给定的shebang,我将它作为shell脚本进行测试时使用sh test.sh
,从zsh
的实例调用脚本与此无关。(也就是说,没有任何东西可以阻止你在zsh
中编写脚本,在这种情况下,我的答案可以适用。)@TobySpeight Add会像你问的那样解释。@TobySpeight是的,我在答案中添加了gnu sed,并且在OP中添加了代码(sed-E's/(^ zA-Z])/\u\2/g')因此,解释应该是,您使用echo
将输入打印到sed
,并且您已经将sed命令更改为与-
或
单独匹配行的开头。请描述一下OP需要做哪些不同的事情。很遗憾问题最初被标记了——因为它被更改了,这绝对是最好的答案。我同意:),但不清楚它是否实际适用。OP没有说明他们是在用zsh
执行脚本,还是只是在运行bash
(或者可能是POSIX)Shell脚本从他们的登录<代码> ZSH 实例。另一个要考虑的是字符串是否包含非单词字符,而不是<代码> > <代码>和<代码> ->代码>,我们不想升级下面的字符。这在上下文中似乎不太可能,但问题在这方面也不够精确。