带bash的变量中的第一个大写字符
我想用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
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而不是操作员。@vwvanbrew安装coreutils gnu-sed
,并按照说明使用不带前缀的命令。g
。值得一提的是,自从获得gnu版本后,我从未想过运行这些命令的OSX版本。@Dean:FWIW,I'v我从来没有想过要运行OSX:-)只要把它改成sed's//\U&/
,它就可以在POSIX-sed上运行。@DavidConradecho“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