例如:var=dog和echo $var输出是狗.资本化$var预期产量狗.
试过多种方式,但只是没有得到预期的输出.一些尝试:
echo $var | sed "s/[a-z]\&[:upper:]//" #dog
echo $var | sed "s/([a-z])/[:upper:]/" #dog
Run Code Online (Sandbox Code Playgroud)
TL;博士:
macOS,支持Unicode, 或 跨平台,但仅限ASCII,并提供背景信息:
tr解决方案.GNU实用程序,支持Unicode(Linux:预安装; macOS:可通过 Homebrew安装):
sed 's/^./\u&/' <<<'dog' # -> 'Dog'
brew install gnu-sed,使用gsed而不是sedawk替代方案:请参阅dev-null的答案
brew install gawk,使用gawk而不是awk.跨平台,支持Unicode:
Bash 4+,支持Unicode,在macOS上你也可以用Homebrew安装:
echo "${var^}"尝试
var='dog'
echo "$(tr '[:lower:]' '[:upper:]' <<<"${var:0:1}")${var:1}" # -> 'Dog'
Run Code Online (Sandbox Code Playgroud)
tr '[:lower:]' '[:upper:]' <<<"${var:0:1}"从$var(${var:0:1})中提取第一个char 并用于tr将其转换为大写.
${var:1}返回第二个字符$var值的所有内容.
请注意,此解决方案是支持Unicode的[1],与macOSawk和Python 2.x解决方案不同 更新:@idjaw修复了Python 2.x解决方案.decode('utf-8'),并且可能也比它们稍微快一些(tr重量轻于awk和python).
[1]这适用于macOS附带的BSD tr版本.相比之下,GNU 没有正确处理非ASCII字符 - 正如John1024所说,根据维基百科的说法,"tr的大多数版本,包括GNU tr和经典Unix tr,都是在单字节字符上运行,不符合Unicode." .tr
至于你尝试 sed解决方案:
使用macOS(BSD)sed,我不知道任何子字符串操作功能.
如果您有GNU sed - 您可以通过Homebrew安装- 您可以使用以下内容:
sed 's/^./\u&/' <<<'dog' # -> 'Dog'
Run Code Online (Sandbox Code Playgroud)
\u告诉GNU Sed将以下字母大写.可悲的是,你不能用macOS的Sed做到这一点.
[:upper:]它只用作匹配的字符类,它从不执行转换,这就是你的命令不起作用的原因.
唯一的例外是tr,您可以将其[:upper:]与[:lower:]效果转换配对,如上面的解决方案.
预览Bash 4 +解决方案:
var='dog'; echo "${var^}"
Run Code Online (Sandbox Code Playgroud)
如果可以的话,您可以使用 Python:
\n\n经过不同人的输入(感谢所有人),这似乎是一个很好的工作解决方案,符合 @PM2Ring 提议的仅首字母的 OP 请求:
\n\n仅针对第一个字符的最佳建议解决方案
\n\nbash-3.2$ var="it\'s an \xc3\xb6yster\'s life"\nbash-3.2$ python -c "import sys;print sys.argv[1].decode(\'utf8\').capitalize()" "$var"\nIt\'s an \xc3\xb6yster\'s life\nRun Code Online (Sandbox Code Playgroud)\n\n以下解决方案尝试将字符串中单词的所有第一个字符大写:
\n\n以下解决方案有一些缺点:
\n\nbash-3.2$ python -c "print raw_input().decode(\'utf-8\').title()" <<<"it\'s an \xc3\xb6yster\'s life" \nIt\'S An \xc3\x96yster\'S Life\nRun Code Online (Sandbox Code Playgroud)\n\n使用变量的简单解决方案:
\n\nbash-3.2$ var=\'dog is dog\'\nbash-3.2$ python -c "print raw_input().decode(\'utf-8\').title()" <<<"$var"\nDog Is Dog\nRun Code Online (Sandbox Code Playgroud)\n\n从这个答案的评论中可以看出(感谢大家的输入),重要的是要注意使用它的局限性,特别是使用 OSX 原生 Python 语言 2.7。
\n\n示例 1:(感谢@john1024 和@dev-null)
\n\n报价问题。
\n\n处理以下字符串示例所需的带有引号的小修改
\n\nvar="it\'s a dog\'s life"\nbash-3.2$ python -c "print \'$var\'.title()"\nIt\'S A Dog\'S Life\nRun Code Online (Sandbox Code Playgroud)\n\n不适用于我的解决方案的其他示例: var="hello \'\'\' world"
示例 2:(感谢@mklement0)
\n\n统一码问题
\n\nbash-3.2$ var=\'\xc3\xb6yster\'\nbash-3.2$ python -c "print \'$var\'.title()"\n\xc3\xb6Yster\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,它将第二个字母大写,这是 title 方法将按照 Python2 中的预期方式将其大写的第一个 ASCII 字符。
\n\n可以对解决方案进行以下修改以帮助处理 unicode 字符:
\n\nbash-3.2$ var=\'\xc3\xb6yster\'\npython -c "print \'$var\'.decode(\'utf-8\').title()" \n\xc3\x96yster\nRun Code Online (Sandbox Code Playgroud)\n\n最后,当将下面讨论的解决方案放在一起时,这就是最终得到的结果:
\n\npython -c "print raw_input().decode(\'utf-8\').title()" <<<"it\'s an \xc3\xb6yster\'s life" \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |