当前位置: 首页>>技术教程>>正文


将upper-case字符串转换为lower-case的命令?

, ,

问题描述

我可以使用什么Bash命令将upper-case字符串转换为lower-case和vice-versa?

谢谢。

最佳解决方案

如果字符串已经存储在变量中,您可以使用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!

upper-case转换与${parameter^^pattern}一起使用:

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

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

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

如果您使用的是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!"

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

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



1)虽然看到zsh有更长的时间,但它应该是:“zsh语法在bash中不起作用。

次佳解决方案

很少有方法可以正常使用Unicode:

GNU sed 4.2.2的工作原理:

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

bash 4.2.45声明不起作用:

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

bash 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 pure 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ą

Python 2在被指示处理Unicode时起作用:

$ 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Ą

第三种解决方案

我会使用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上已经过时并被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.

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

第四种方案

您可以使用tr命令执行此操作。

在终端(Ctrl + Alt + T)

这个命令:

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

将小写转换为大写。

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

将大写转换为小写。

例:

bash,scripts,ubuntu

积分转到cybercity

第五种方案

您也可以通过sed管道:

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

\L将产生相反的效果:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1749.html,未经允许,请勿转载。