问题描述
我可以使用什么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:]"
将大写转换为小写。
例:
积分转到cybercity
第五种方案
您也可以通过sed
管道:
$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE
而\L
将产生相反的效果:
$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase