用tr命令调换的案例

110 阅读1分钟

想在*nix命令行上轻松地调换一些字符串的大小写吗?tr 命令可以做到这一点。

你可能已经知道,tr 命令可以将小写字母转换为大写字母

$ echo "HI there" | tr '[:lower:]' '[:upper:]'
HI THERE

或者将大写字母换成小写字母

$ echo "HI there" | tr '[:lower:]' '[:upper:]' | tr '[:upper:]' '[:lower:]'
hi there

但我们可以更进一步,告诉tr ,不仅可以将所有小写字母切换为大写字母,还可以在一次转换中将所有大写字母切换为小写字母

$ echo "HI there" | tr '[:lower:][:upper:]' '[:upper:][:lower:]'
hi THERE

因为我们使用的是字符类,而不是简单的a-zA-Z ,这意味着unicode字母也可以工作:

$ echo "CAfé" | tr "[:lower:][:upper:]" "[:upper:][:lower:]"
caFÉ

这是因为tr 的参数是一个成对的变换列表。字符串1(第一个参数)中的每个字符将被替换为字符串2(第二个参数)中的字符的相应索引

$ echo crab | tr abc ABC
CrAB

上面的命令中,第一个字符串为abc ,第二个字符串为ABC 。这意味着tr 将对它们进行这样的配对

a => A
b => B
c => C

tr 进行换码意味着使这些字符串包括大写和小写字符。如果我们从翻译对中随机挑选,它可能看起来像这样:

P => p
k => K
X => x
x => X
W => w
M => m
F => f

为什么要这样做?对我来说,我想要一个小写字母、大写字母和数字的列表。printable-ascii 可以很容易地为我提供这个列表,但我想从小写字母到大写字母再到数字。但是ASCII的顺序是大写字母优先:

$ printable-ascii --letters --digits --compact
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

可以更明确地告诉printable-ascii ,如何按我想要的顺序手动定义输出的范围:

$ printable-ascii --range a-z --range A-Z --digits --compact
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

但是,tr 命令可以很容易地为我完成这项工作。既然我明确地处理了ASCII,我可以简单地使用a-zA-Z

$ printable-ascii --letters --digits --compact | tr A-Za-z a-zA-Z
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789