我可以使用什么 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
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
。
答案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