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

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

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

谢谢。

答案1

如果字符串已经存储在变量中,则可以使用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,你可以使用参数扩展标志${(FLAGS)NAME}; 自 zsh 2.5 起可用)可实现相同结果。语法在1)bash中不起作用。小写的标志是;大写的标志是:zsh LU

$ 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

答案2

很少有方法可以正确使用 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.42declare和参数扩展工作

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

呆呆地作品

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

当需要处理 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Ą

答案3

我会使用 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.

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

答案4

sed也可以通过管道传输内容:

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

\L会产生相反的效果:

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

相关内容