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 实例。另一个要考虑的是字符串是否包含非单词字符,而不是<代码> > <代码>和<代码> ->代码>,我们不想升级下面的字符。这在上下文中似乎不太可能,但问题在这方面也不够精确。