命令将大写字符串转换为小写?


Answers:


59

如果字符串已经存储在变量中,则可以使用bash的参数扩展,具体来说${parameter,,pattern}(自bash 4.0起可用),其中parameter变量的名称为,pattern并被忽略:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

请注意,这不会更改变量的值,只会更改输出。要更改变量,您必须分配新值:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

大写转换适用于${parameter^^pattern}

$ echo ${string^^}
HELLO, WORLD!

这也适用于Unicode字符串(至少在当前bash版本中,可能至少需要bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

如果使用zsh,则可以使用Parameter Expansion Flags${(FLAGS)NAME};从zsh 2.5开始可用;)可以达到相同的结果。该bash语法在zsh 1)中不起作用。小写的标志是L; 大写的是U

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

这也适用于Unicode字符串(至少从zsh 5.0起;我没有尝试使用早期版本):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1)尽管看到zsh的时间更长了,但它可能应该是:zsh语法在中不起作用bash


3
${string,,}符号仅适用于bash版本4+。否则,需要其他解决方案之一,例如$(echo $string | tr '[:upper:]' '[:lower:]')
Quinn Comendant '16

40

很少有可以与Unicode一起正常使用的方法:

GNU sed 4.2.2的工作原理

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

庆典4.2.45申报并不能正常工作:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

庆典4.2.45参数扩展并没有工作:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declare和参数扩展工作

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU TR 8.20并没有工作:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk(在Ubuntu 13.10默认AWK)不工作:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk 作品

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl的纯UC()并没有工作:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

没有任何Unicode提示的Python 2 无法正常工作:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

当指示要处理Unicode时,Python 2可以工作

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3的工作原理

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ

1
在Ubuntu 13.04上,我具有gawk默认的awk(如所示update-alternatives --display awk)。您确定mawk13.10是默认设置吗?
kiri

sed自1990年以来一直支持该\U选项;-)。不是特定的特定功能。否则,很好的答案,那么多的选择,那么少的时间;-)祝大家好运!
剥壳机2014年

另外还会有一些问题与土耳其(点和无点我),在下面的链接的详细外观: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/... - en.wikipedia。 org / wiki / Dotted_and_dotless_I
2014年

在您的示例中,钱包uc在Perl中不起作用,因为您必须使用use Encodeuse utf8。将示例重写为 echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))',它将起作用。另请参见 stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy

20

我将使用bash内部排版声明命令来定义小写变量。

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

设置值时,字符降低,而不是键入变量时。因此,最好在脚本的开头进行排版。对于大写字母,可以键入-u

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

这不是bash shell特有的,它也可以在ksh上工作,也许在POSIX shell定义中也可以。

编辑:许多人轻轻地向我指出,现在排版在bash上已被废弃,而由声明取代。这两个命令是等效的。

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

当我在异构环境上工作时,我本人仍在使用排版语法,因此不必重写脚本。


2
+1令人难以置信,我从来不知道那一个!顺便说一句一些额外的信息:我在手册中进行了查找,似乎typeset已被贬低并由declare
thom 2013年

1
@thom谢谢,看来bash的生命似乎远非其“伯恩贝壳根” :)
Emmanuel

17

您可以使用tr命令来完成。

在终端(Ctrl+ Alt+ T

该命令:

echo 'String here' | tr "[:lower:]" "[:upper:]"

将小写转换为大写。

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

将大写转换为小写。

例:

在此处输入图片说明

信誉归于网络城市


2
如果您不关心语言环境,tr A-Z a-z也可以使用。
Nick Matteo

9

您也可以通过管道传递内容sed

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

并且\L会产生相反的效果:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

这不是纯粹的bash解决方案,但您可以通过管道传递字符串perl(就像 Oli所做的那样sed):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

并且\L会产生相反的效果:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.