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

rɑː*_*dʒɑ 48 bash scripts

我可以使用什么 Bash 命令将大写字符串转换为小写字符串,反之亦然?

谢谢你。

Ada*_*hon 60

如果字符串已经存储在一个变量中,您可以使用bash的参数扩展,特别是${parameter,,pattern}(自 bash 4.0 起可用),其中parameter是您的变量的名称pattern并被省略:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!
Run Code Online (Sandbox Code Playgroud)

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

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!
Run Code Online (Sandbox Code Playgroud)

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

$ echo ${string^^}
HELLO, WORLD!
Run Code Online (Sandbox Code Playgroud)

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

$ string='?????????'
$ echo ${string,,}
?????????
$ echo ${string^^}
?????????
Run Code Online (Sandbox Code Playgroud)

如果您正在使用zsh,则可以使用参数扩展标志${(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!"
Run Code Online (Sandbox Code Playgroud)

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

$ string='?????????'
$ echo ${(L)string} 
?????????
$ echo ${(U)string}  
?????????
Run Code Online (Sandbox Code Playgroud)



1)虽然,看到 zsh 有这个更长的时间,它可能应该是:zsh语法在bash.

  • `${string,,}` 符号只存在于 bash 版本 4+。否则需要其他解决方案之一,例如`$(echo $string | tr '[:upper:]' '[:lower:]')`。 (5认同)

Mic*_*jer 40

很少有方法可以与 Unicode 一起正常工作:

GNU sed 4.2.2工作

$ echo "Id? g?si ??k?" | sed 's/.*/\U&/'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

庆典4.2.45申报确实工作:

$ typeset -u ucase; ucase="Id? g?si ??k?"; echo $ucase
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

庆典4.2.45参数扩展不会工作:

$ str="Id? g?si ??k?"; echo ${str^^}
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

bash 4.3.42declare和参数扩展工作

$ declare -u ucase
$ ucase="Id? g?si ??k?"
$ echo $ucase
ID? G?SI ??K?
$ echo ${ucase,,}
id? g?si ??k?
Run Code Online (Sandbox Code Playgroud)

GNU TR 8.20做工作:

$ echo "Id? g?si ??k?" | tr '[:lower:]' '[:upper:]'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

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

$ echo "Id? g?si ??k?" | mawk '{print toupper($0)}'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

gawk作品

$ echo "Id? g?si ??k?" | gawk '{print toupper($0)}'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

Perl的纯UC()做工作:

$ echo "Id? g?si ??k?" | perl -ne 'print uc($_);'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

Python 2里没有任何Unicode提示并不能正常工作:

$ echo "Id? g?si ??k?" | python -c 'import sys; print sys.stdin.read().upper(),'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

Python 2 在指示处理 Unicode工作时

$ echo "Id? g?si ??k?" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)

Python 3作品

$ echo "Id? g?si ??k?" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
ID? G?SI ??K?
Run Code Online (Sandbox Code Playgroud)


Emm*_*uel 21

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

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case
Run Code Online (Sandbox Code Playgroud)

设置值时降低字符,而不是排版变量时。所以最好在脚本的开头排版。对于大写,您可以排版 -u

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE
Run Code Online (Sandbox Code Playgroud)

这不是特定于 bash shell,它也适用于 ksh,也许它在 POSIX shell 定义中。

编辑:许多人轻轻地向我指出,现在排版在 bash 上已过时并被declare取代。这两个命令是等效的。

$ 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.
Run Code Online (Sandbox Code Playgroud)

当我在异构环境中工作时,我自己仍然使用排版语法,所以我不必重写我的脚本。

  • +1 难以置信,我从来不知道那个!顺便说一句,一些额外的信息:我在手册中查了一下,似乎“排版”被认为已弃用并被“声明”取代 (2认同)

rɑː*_*dʒɑ 18

你可以用tr命令来做。

在终端 ( Ctrl+ Alt+ T)

这个命令:

echo 'String here' | tr "[:lower:]" "[:upper:]"
Run Code Online (Sandbox Code Playgroud)

将小写转换为大写。

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
Run Code Online (Sandbox Code Playgroud)

将大写转换为小写。

例子:

在此处输入图片说明

幸得数码城市

  • 如果你不关心语言环境,`tr AZ az` 也可以。 (2认同)

Oli*_*Oli 9

你也可以通过管道传输sed

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE
Run Code Online (Sandbox Code Playgroud)

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

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
Run Code Online (Sandbox Code Playgroud)