262

我想用bash只大写字符串中的第一个字符。

foo=“bar”;//大写第一个字符echo$foo;

应打印“条形图”;

2

17个答案17

重置为默认值
462

使用bash的单向(版本4+):

foo=巴echo“${foo ^}”

打印:

酒吧
22
  • 5
    这有相反的吗? 评论 2015年12月16日12:06
  • 71
    @CMCDragonkai:要使第一个字母小写,请使用“${foo,}”。要将所有字母小写,请使用“${foo,,}”。若要大写所有字母,请使用“${foo^^}”.
    – 史蒂夫
    评论 2015年12月16日21:37
  • 1
    我无意中注意到${foo~}${foo~~}具有与${foo ^}${foo^^}但我从来没有在任何地方提到过这种选择。
    – 米夫克
    评论 2019年2月9日13:16
  • 26
    这在Mac上似乎不起作用。获取以下错误:错误的替换 评论 2019年5月10日16:42
  • 4
    @TolandHon:正如你可能已经解决的那样,你需要升级到4.x版,或者如果由于某种原因无法升级该机器,请尝试其他解决方案。
    – 史蒂夫
    评论 2019年5月14日0:20
220
foo=“$(tr'[:lower:]''[:upper:]'<<${foo:0:1})${foo:1}”
11
  • 4
    尽管这个答案比得分最高的答案更复杂,但实际上它确实做到了这一点:“变量中的大写第一个字符”。得分最高的答案没有这样的结果。看起来简单的答案比正确的答案更受欢迎? 评论 2016年2月26日15:48
  • 18
    @KrzysztofJabłoński:事实上,下面的“最佳得分答案”将产生与Bash 4下的答案相同的结果。这个答案包含调用子shell(另一个shell)的开销、调用“tr”实用程序(另一进程,而不是Bash)的开销以及使用here-doc/string(临时文件创建)的开销,与得分最高的答案相比,它使用了两个替换。如果您必须编写遗留代码,请考虑使用函数而不是子shell。
    – 史蒂夫
    评论 2016年4月13日23:57
  • 这个答案假设输入都是小写。此变量没有假设:$(tr“[:lower:]”“[:upper:]”<<${foo:0:1})$(tr'[:upper:]”“[:lower:]'<<$}foo:1} 评论 2016年7月6日7:18
  • 7
    @ItaiHanski OP没有指定其余字符应该发生什么,只指定了第一个字符。假设他们想改变不退出Comel进入之内不退出竞标。您的变体有副作用,或者强制将其余部分小写,但代价是子shell和tr进程的数量增加了一倍。 评论 2016年7月27日20:54
  • @丹尼尔·奥兰多,没错,但这个问题除了猛击. 评论 2017年3月10日3:48
43

单向塞德:

echo“$(echo”$foo“|sed的/.*/\u&/')”

打印:

酒吧
10
  • 13
    在MacOS10 Lion sed上不起作用,唉,\u扩展为u而不是操作符。 评论 2014年6月7日1:36
  • 2
    @大众货车brew安装coreutils gnu-sed并按照说明使用不带前缀的命令。值得一提的是,自从获得GNU版本以来,我从未想过运行这些命令的OSX版本。
    – 院长
    评论 2014年8月26日19:01
  • @迪恩:FWIW,我从未想过运行OSX:-)
    – 史蒂夫
    评论 2014年8月26日22:41
  • 6
    只需将其更改为sed的//\U型&/它将在POSIX sed上工作。 评论 2017年5月26日15:29
  • 6
    @戴维·康拉德echo“bar”sed的//\U(&/)'生产乌巴尔在mac上。我想\U型不是POSIX标准,而是GNU扩展。 评论 2020年8月6日1:30
37

仅大写第一个单词:

foo='一二三'foo=“${foo^}”回声$foo

O(运行)ne二三


大写每个字在变量中:

foo=“一二三”foo=($foo)#不带引号foo=“${foo[@]^}”echo$foo

O(运行)T型T型


(在bash 4+中工作)

  • 1
    foo=“一个二个三”;foo=$(对于$foo中的i;do echo-n“${i^}”;完成)每个单词的分辨率更短。foo公司现在是“一二三” 评论 2018年12月16日16:11
  • 如何将前3个或4个字母大写?喜欢第123-v1页PQRS-123-v1型? 或者你可以说,第一个连字符之前的所有字母。。。 评论 2020年7月21日15:03
  • 这既简单又完美。 评论 2021年6月15日20:22
29
$foo=“bar”;$foo=`echo${foo:0:1}|tr'[a-z]“[a-z]”`${foo:1}$echo$foo酒吧
18

仅使用awk

foo=“uNcapItalizedsrIng”echo$foo|awk“{打印toupper(substr($0,0,1))tolower(substr($0,2))}”
2
  • 1
    结果:非资本化字符串 评论 2019年7月22日14:43
  • 看着这个就像👁️👄👁️
    – 詹姆逊
    评论 2020年8月12日2:59
16

以下是“本机”文本工具的方式:

#!/垃圾桶/垃圾桶string=“abcd”first=`echo$string|cut-c1|tr[a-z][a-z]`秒=`echo$string|cut-c2-`echo$第一个$second
  • 2
    最后是在Mac上使用变量的东西!谢谢您! 评论 2017年1月20日16:02
  • 5
    @丹尼尔·奥兰多(Daniele Orlando),不像人们希望的那样轻便。tr[:下:][:上:]如果它需要在包含不在a-z型A-Z(A-Z)范围。 评论 2017年3月8日18:01
  • 不错的unix工具答案。虽然查尔斯说的是对的。事实上,在tr的手册页上,它说:将file1的内容转换为大写。tr“[:下:]”“[:上:]”<文件1还有那个(与传统的UNIX习惯用法“tr a-z a-z”相比,这应该更可取,因为它在所有地区都能正常工作。).
    – 力士源
    评论 2022年11月11日20:51
14

只是为了好玩,你是:

foo=“bar”;echo$foo|awk'{$1=toupper(子($1,0,1))子($1.2)}1'#或echo${foo^}#或echo$foo|head-c1|tr[a-z][a-z];echo$foo|tail-c+2#或echo${foo:1}|sed-e的/^/\B和/'
4
  • 1
    感谢AFAICT只有不涉及GNUisms的解决方案。
    – 兹沃尔
    评论 2020年10月7日18:29
  • 2
    (具体来说awk公司该解决方案适用于任何符合POSIX的awk。)
    – 兹沃尔
    评论 2020年10月7日18:33
  • 2
    这适用于MacOS和ZSH。 评论 2021年12月5日7:43
  • 第四个示例仅适用于以字母B开头的字符串。这确实使它的通用性略低于本页上的其他答案。
    – 克里斯
    评论 2023年1月24日8:03
7

也可以使用bash-3.2在纯bash中完成:

#首先,获取第一个字符。fl=${foo:0:1}#安全检查:必须是字母:)。如果[[${fl}==[a-z]]];然后#现在,使用printf(builtin)获取其八进制值。ord=$(打印“%o”“${fl}”)#有趣的事实:[a-z]映射到0141..0172。[A-Z]为0101..0132。#我们可以使用十进制“-40”来获得预期结果!ord=$((ord-40))#最后,将新值映射回字符。fl=$(打印“%b”\“${ord}”)fi(菲涅耳)echo“${fl}${foo:1}”
4
  • 如何定义foo?我试过了foo=1美元但我只知道-bash:foo:找不到命令 评论 2017年1月20日16:01
  • 2
    @OZZIE,周围没有空间=在作业中。这是一个shellcheck.net将以编程方式为您查找。 评论 2017年3月8日18:00
  • 我总是忘记shell脚本。。只有一个空格(前/后)重要的语言。。。叹息(如果我没记错的话,蟒蛇至少4岁) 评论 2017年3月9日7:19
  • @奥兹,它重要的是,因为如果不重要的话,你就不能通过=作为程序的参数(它应该如何知道一些程序=正在运行一些程序,或分配给名为一些程序?) 评论 2017年3月10日3:38
7

这也行得通。。。

FooBar=巴兹echo${FooBar^^${Foo Bar:0:1}}=>巴兹
FooBar=巴兹echo${FooBar^^${Foo Bar:1:1}}=>bAz(蓝色)
FooBar=巴兹echo${FooBar^^${FooBar:2:2}}=>baZ

等等。

资料来源:

简介/教程:

2

这个对我很有效:

在当前目录中搜索所有*php文件,并将每个文件名的第一个字符替换为大写字母:

例如:test.php=>test.php

对于*php中的f;执行mv“$f”“$(\sed的/.*/\u&/'<<“$f“)”;完成
1
  • 7
    最初的问题是一个字符串,没有提到重命名文件。 评论 2017年2月20日18:45
2

Linux和OSX的替代和干净解决方案,它也可以与bash变量一起使用

python-c“打印(\”abc\“.capitalie())”

返回Abc

0

据我所知,这是POSIX sh-compatible。

upper_first.sh:

#!/垃圾桶/桶printf“$1”|剪切-c1-z | tr-d'\0'| tr[:下:][:上:]printf“$1”|剪切-c2-

切割-c1-z以结尾第一个字符串\0而不是\n个。它被移除tr-d“\0”。它也可以省略-z(z)和使用tr-d'\n'相反,如果字符串的第一个字符是换行符,则会中断。

用法:

$upper_first.sh foo$

在函数中:

#!/垃圾桶/桶函数upper_first(){printf“$1”|剪切-c1-z | tr-d'\0'| tr[:下:][:上:]printf“$1”|剪切-c2-}old=“foo”new=“$(upper_first”$old“)”echo“$新”
0

符合Posix且子流程更少:

v=“foo[Bar]”打印f“%s”“${v%”${v#?}“}”|tr'[:下部:]'[:上部:]'&&printf“%s“${v#?}”==>Foo[酒吧]
-1
第一个字母到下一个字母(){str=“”空格=“”对于我来说$@if[-z$(echo$i|grep“the \ | of \ | with”)]然后str=$str“$(echo${i:0:1}|tr‘[A-Z]’‘[A-Z]’)${i:1}$space”其他的str=$str${i}$spacefi(菲涅耳)完成echo$str}第一个字母到上-xc(){v-first letter to upper | xclip-选择剪贴板}第一个字母到上(){str=“”空格=“”对于我来说$@if[-z$(echo$i|grep“the \ | of \ | with”)]然后str=$str“$(echo${i:0:1}|tr'[a-z]'[a-z]')${i:1}$空格”其他的str=$str${i}$spacefi(菲涅耳)完成echo$str}

第一个字母到小写-xc(){v首字母到下| xclip-选择剪贴板}

-4

不完全是问什么,但很有帮助

declare-u foo#为变量赋值时,所有小写字符都转换为大写。foo=巴echo$foo酒吧

反之亦然

declare-l foo#为变量赋值时,所有大写字符都会转换为小写。foo=巴echo$foo酒吧
-7

如果第一个字符不是一个字母(但是一个标签、一个空格和一个转义双引号)?我们最好测试直到我们找到一封信!因此:

S='\“ófoo bar\”'N=0直到[[${S:$N:1}=~[[:alpha:]]];do N=$[$N+1];完成#F=`echo${S:$N:1}|tr[:lower:][:upper:]`#F=`echo${S:$N:1}|sed-E-E'S//\u&&'`#其他选项F=`echo${S:$N:1}F=`echo${F}#将纯Bash解决方案转换为“上层”echo“$F”${S:(($N+1))}#没有垃圾echo'='${S:0:($N))}“$F”${S:(($N+1))}'='#垃圾被保存Foo酒吧=\“Foo酒吧=
8
  • 6
    请编写更干净的代码!你缺少引号到处都是。你使用的是过时的语法(反勾号);你使用的是过时的语法($[...]). 你用了很多无用的括号。您假设字符串由拉丁字母表中的字符组成(重音字母或其他字母表中字母如何?)。要使这个代码片段可用,您需要做大量工作!(既然您使用的是regex,那么您还不如使用regex来查找第一个字母,而不是循环)。 评论 2017年3月8日18:05
  • 6
    我认为你错了。这是伴随着否决票的强制性评论,解释了所有错误的模式和对答案的误解。请从你的错误中吸取教训(在此之前,试着理解它们),而不是固执。做一个好人也与传播不良行为不相容。 评论 2017年3月9日9:44
  • 1
    或者,如果使用Bash≥4,则不需要信托收据:如果[[$S=~^([^[:alpha:]]*)([[:alfa:].*)]];然后输出=${BASH_REMATCH[1]}${BASH_REMATCH[2]^};else out=$S;fi;打印“%s\n”“$out” 评论 2017年3月9日9:51
  • 5
    这个代码仍然被严重破坏。它仍然使用反勾号代替现代替换语法;它仍然有无与伦比的引用;它仍然缺少引号在他们真正重要的地方; 等。如果您不相信那些缺少的引号会产生影响,请尝试在测试数据中添加一些空格环绕的glob字符,并解决问题shellcheck.net找到,直到此代码清除为止。 评论 2017年3月10日3:40
  • 2
    至于你引用的语言unix.stackexchange.com/questions/68694/…,你想念的是回声$foo是一个情况的例子解析器需要一个单词列表; 所以在你的echo${F},的内容F类是字符串拆分和全局扩展。对于回显${S:$N:1}示例和所有其他内容。请参见BashPitfills#14. 评论 2017年3月10日3:45

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.