带bash的变量中的第一个大写字符

带bash的变量中的第一个大写字符,bash,Bash,我想用bash将字符串中的第一个字符大写 foo="bar"; //uppercase first character echo $foo; 应打印“栏” bash的单向(版本4+): 印刷品: Bar foo=“$(tr'[:lower:][:upper:][p>使用sed的单向键: echo "$(echo "$foo" | sed 's/.*/\u&/')" 印刷品: Bar 也可以使用bash-3.2在纯bash中完成: # First, get the first

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

foo="bar";

//uppercase first character

echo $foo;
应打印“栏”

bash的单向(版本4+):

印刷品:

Bar

foo=“$(tr'[:lower:][:upper:][p>使用
sed的单向键

echo "$(echo "$foo" | sed 's/.*/\u&/')"
印刷品:

Bar

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

# First, get the first character.
fl=${foo:0:1}

# Safety check: it must be a letter :).
if [[ ${fl} == [a-z] ]]; then
    # Now, obtain its octal value using printf (builtin).
    ord=$(printf '%o' "'${fl}")

    # Fun fact: [a-z] maps onto 0141..0172. [A-Z] is 0101..0132.
    # We can use decimal '- 40' to get the expected result!
    ord=$(( ord - 40 ))

    # Finally, map the new value back to a character.
    fl=$(printf '%b' '\'${ord})
fi

echo "${fl}${foo:1}"
第一个字母到下一个字母-xc(){ v-首字母到下字母| xclip-选择剪贴板 }以下是“本机”文本工具的方式:

#!/bin/bash

string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second

这一个对我有用:

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

e、 g:test.php=>test.php

for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done

对于*php中的f;执行mv“$f”“$”(\sed's/*/\u&/'如果第一个字符不是一个字母(而是一个制表符、一个空格和一个转义的双引号),我们最好测试它,直到找到一个字母为止!因此:

S='  \"ó foo bar\"'
N=0
until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done
#F=`echo ${S:$N:1} | tr [:lower:] [:upper:]`
#F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option
F=`echo ${S:$N:1}
F=`echo ${F} #pure Bash solution to "upper"
echo "$F"${S:(($N+1))} #without garbage
echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved

Foo bar
= \"Foo bar=
仅使用awk

foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'

要仅大写第一个单词:

foo='one two three'
foo="${foo^}"
echo $foo
One二三


要大写变量中的每个单词,请执行以下操作:

foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
OneTwoThree


(适用于bash 4+)

这也适用于

FooBar=baz

echo ${FooBar^^${FooBar:0:1}}

=> Baz
等等

资料来源:

  • Bash手册:
  • 完整Bash指南:
  • Bash黑客维基
产品介绍/教程:

  • Cyberciti.biz:
  • Opensource.com:

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

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

返回Abc

只是为了好玩你在这里:

foo="bar";    

echo $foo | awk '{$1=toupper(substr($1,0,1))substr($1,2)}1'
# or
echo ${foo^}
# or
echo $foo | head -c 1 | tr [a-z] [A-Z]; echo $foo | tail -c +2
# or
echo ${foo:1} | sed -e 's/^./\B&/'

不完全是你要的,但很有帮助

declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.

foo=bar
echo $foo
BAR
反之亦然

declare -l foo #When the variable is assigned a value, all upper-case characters are converted to lower-case.

foo=BAR
echo $foo
bar


MacOS10 Lion-sed不工作,叹气,\u扩展为u而不是操作员。@vwvan
brew安装coreutils gnu-sed
,并按照说明使用不带前缀的命令。
g
。值得一提的是,自从获得gnu版本后,我从未想过运行这些命令的OSX版本。@Dean:FWIW,I'v我从来没有想过要运行OSX:-)只要把它改成
sed's//\U&/
,它就可以在POSIX-sed上运行。@DavidConrad
echo“bar”| sed's/\U&/'
在mac上生成
Ubar
。我认为
\U
不是POSIX标准,而是GNU扩展。有没有与此相反的地方吗?@CMCDragonkai:要将第一个字母小写,请使用
”${foo,}“
。要将所有字母小写,请使用
“${foo,}”
。要将所有字母大写,请使用
“${foo^^}”
。我无意中注意到
${foo~}
${foo~}
${foo^}和
${foo^}具有相同的效果
。但我从来没有在任何地方提到过这种替代方案。这似乎在Mac上不起作用。出现以下错误:
替换错误
@TolandHon:正如您可能已经解决的,您需要升级到4.x版,或者如果由于某种原因无法升级该机器,请尝试其他解决方案。这不是完全重复的,但是t中描述的许多技术也可以应用于此问题。虽然此问题是关于Bash的,但Zsh用户可以查看。尽管比最佳评分答案更复杂,但此答案实际上确实做到了:“变量中的大写字母第一个字符”。最佳评分答案没有这样的结果。看起来简单的答案是upv比起正确的答案,你更愿意去做什么?@KrzysztofJabłoński:实际上,下面的“最佳评分答案”将产生与Bash 4下的这个答案相同的结果。这个答案有调用子shell(另一个shell)的开销,调用“tr”实用程序(另一个进程,而不是Bash)的开销,以及使用here doc/string的开销(临时文件创建),它使用两个替换,与最好的答案的一个相比。如果你绝对必须编写遗留代码,考虑使用一个函数而不是一个子shell。这个答案假设输入都是小写的。这个变体没有假设:$(Tr’::下:)[[上::] ]。“@ItaiHanski OP没有指定剩余字符的处理方式,只指定了第一个字符。假设他们想将
notQuiteCamel
更改为
notQuiteCamel
。您的变体有副作用,或者强制剩余字符使用小写-代价是子shell和tr进程的数量翻倍。@Danielo,是的,但是这个问题除了
bash
之外没有其他标签。如何定义foo?我尝试了
foo=$1
,但我只得到了
-bash:foo:command-not found
@OZZIE,在赋值中
=
周围没有空格。这是编程上可以为您找到的东西。我总是忘了shell脚本。只有语言where one space(before/after)很重要……叹气(如果我没记错的话,python至少是4)@OZZIE,这很重要,因为如果它不重要,你就不能将
=
作为参数传递给程序(如何知道
someprogram=
是否正在运行
someprogram
,或是分配给一个名为
someprogram
的变量?)终于有了一个可以在Mac上使用的变量!谢谢!@danielaolando,不像人们希望的那么便携。
tr[:lower:[:upper:]如果它需要在包含不在
a-z
a-z
范围内的字母的语言/区域设置中工作,那么它是一个更好的选择。最初的问题是一个字符串,没有提及重命名文件。请编写更干净的代码!到处都缺少引号。您使用的是过时的语法(反勾号);您正在使用过时的语法(
$[…]
)。您正在使用大量无用的括号。您假设字符串由拉丁字母表中的字符组成(重音字母或其他字母表中的字母如何?)。要使此代码段可用,您需要做大量工作!(既然您使用的是正则表达式,那么最好使用正则表达式来查找第一个字母,而不是
FooBar=baz

echo ${FooBar^^${FooBar:0:1}}

=> Baz
FooBar=baz

echo ${FooBar^^${FooBar:1:1}}

=> bAz
FooBar=baz

echo ${FooBar^^${FooBar:2:2}}

=> baZ
foo="bar";    

echo $foo | awk '{$1=toupper(substr($1,0,1))substr($1,2)}1'
# or
echo ${foo^}
# or
echo $foo | head -c 1 | tr [a-z] [A-Z]; echo $foo | tail -c +2
# or
echo ${foo:1} | sed -e 's/^./\B&/'
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.

foo=bar
echo $foo
BAR
declare -l foo #When the variable is assigned a value, all upper-case characters are converted to lower-case.

foo=BAR
echo $foo
bar