在bash 3.2中使用字符串的最简单方法是什么?

fab*_*bbb 4 macos bash shell

例如:var=dogecho $var输出是.资本化$var预期产量.

试过多种方式,但只是没有得到预期的输出.一些尝试:

echo $var | sed "s/[a-z]\&[:upper:]//"  #dog
echo $var | sed "s/([a-z])/[:upper:]/"  #dog
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 7

TL;博士:

  • macOS,支持Unicode, 跨平台,但仅限ASCII,并提供背景信息:

    • 请参阅以下tr解决方案.
  • GNU实用程序,支持Unicode(Linux:预安装; macOS:可通过 Homebrew安装):

    • sed 's/^./\u&/' <<<'dog' # -> 'Dog'
      • macOS:安装后brew install gnu-sed,使用gsed而不是sed
    • awk替代方案:请参阅dev-null的答案
      • macOS:安装后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],与macOSawkPython 2.x解决方案不同 更新:@idjaw修复了Python 2.x解决方案.decode('utf-8'),并且可能也比它们稍微快一些(tr重量轻于awkpython).

[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)


idj*_*jaw 3

如果可以的话,您可以使用 Python:

\n\n

经过不同人的输入(感谢所有人),这似乎是一个很好的工作解决方案,符合 @PM2Ring 提议的仅首字母的 OP 请求:

\n\n

仅针对第一个字符的最佳建议解决方案

\n\n
bash-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\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下解决方案尝试将字符串中单词的所有第一个字符大写:

\n\n

以下解决方案有一些缺点:

\n\n
bash-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\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用变量的简单解决方案:

\n\n
bash-3.2$ var=\'dog is dog\'\nbash-3.2$ python -c "print raw_input().decode(\'utf-8\').title()" <<<"$var"\nDog Is Dog\n
Run Code Online (Sandbox Code Playgroud)\n\n

从这个答案的评论中可以看出(感谢大家的输入),重要的是要注意使用它的局限性,特别是使用 OSX 原生 Python 语言 2.7。

\n\n

示例 1:(感谢@john1024 和@dev-null)

\n\n

报价问题。

\n\n

处理以下字符串示例所需的带有引号的小修改

\n\n
var="it\'s a dog\'s life"\nbash-3.2$ python -c "print \'$var\'.title()"\nIt\'S A Dog\'S Life\n
Run Code Online (Sandbox Code Playgroud)\n\n

不适用于我的解决方案的其他示例: var="hello \'\'\' world"

\n\n

示例 2:(感谢@mklement0)

\n\n

统一码问题

\n\n
bash-3.2$ var=\'\xc3\xb6yster\'\nbash-3.2$ python -c "print \'$var\'.title()"\n\xc3\xb6Yster\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,它将第二个字母大写,这是 title 方法将按照 Python2 中的预期方式将其大写的第一个 ASCII 字符。

\n\n

可以对解决方案进行以下修改以帮助处理 unicode 字符:

\n\n
bash-3.2$ var=\'\xc3\xb6yster\'\npython -c "print \'$var\'.decode(\'utf-8\').title()" \n\xc3\x96yster\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,当将下面讨论的解决方案放在一起时,这就是最终得到的结果:

\n\n
python -c "print raw_input().decode(\'utf-8\').title()" <<<"it\'s an \xc3\xb6yster\'s life" \n
Run Code Online (Sandbox Code Playgroud)\n

  • 绕过 OSX 限制(+1)的好方法,但尝试使用: `var="it's a dogs life"` (2认同)
  • 虽然这显示了 python 的 title 函数的局限性,但请考虑 `echo "$var" | python2 -c“打印raw_input().title()”` (2认同)
  • 这是非常正确的!尽管如此,这仍然是一个有趣的讨论。+1。 (2认同)