暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

shell 命令 用 tr 进行转换

原创 Steven 云和恩墨 2022-03-30
999

它可用于编写优雅的单行命令。tr可以对 来自标准输入的内容进行字符替换、字符删除以及重复字符压缩。tr是translate(转换)的简写, 因为它可以将一组字符转换成另一组字符。在这则攻略中,看到如何使用tr进行基本的集 合转换。

预备知识

tr只能通过stdin(标准输入)接收输入(无法通过命令行参数接收)。其调用格式如下:

tr [options] set1 set2

来自stdin的输入字符     按照位置从set1映射到set2(set1中的第一个字符映射到set2 中的第一个字符,以此类推),然后将输出写入stdout(标准输出)。set1和set2是字符类或字

符组。如果两个字符组的长度不相等,那么set2     不断复制其最后一个字符,直到长度与set1 相同。如果set2的长度大于set1,那么在set2中超出set1长度的那部分字符则全部被忽略

实战演练

要将输入中的字符由大写转换成小写,可以使用下面的命令

$ echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'

hello who is this

'A-Z'和'a-z'都是字符组。我们可以按照需要追加字符或字符类来构造自己的字符组。


工作原理

在tr中利用集合的概念,可以轻松地将字符从一个集合映射到另一个集合中。下面来看一个 用tr进行数字加密和解密的例子:


tr命令可以用来加密。ROT13是一个著名的加密算法。在ROT13算法中,字符被移动13 个位置,因此文本加密和解密都使用同一个函数:

$ echo "tr came, tr saw, tr conquered." | tr 'a-zA-Z' 'n-za-mN-ZA-M'

输出如下

ge pnzr, ge fnj, ge pbadhrerq.

对加密后的密文再次使用同样的ROT13函数,我们可以采用

$ echo ge pnzr, ge fnj, ge pbadhrerq. | tr 'a-zA-Z' 'n-za-mN-ZA-M'

输出如下:

 tr came, tr saw, tr conquered.

tr还可以将制表符转换成单个空格:


补充内容

我们已经学习了tr的一些基本转换,接下来看看tr还能帮我们实现的其他功能。

1. 用tr删除字符

tr有一个选项-d,可以通过指定需要被删除的字符集合,将出现在stdin中的特定字符清 除掉:

$ cat file.txt | tr -d '[set1]' #只使用set1,不使用set2

$ echo "Hello 123 world 456" | tr -d '0-9'

 Hello world           # 将stdin中的数字删除并打印删除后的结果

2. 字符组补集

我们可以利用选项-c来使用set1的补集。下面的命令中,set2是可选的

tr -c [set1] [set2]

如果只给出了set1,那么tr删除所有不在set1中的字符。如果也给出了set2,tr将不 在set1中的字符转换成set2中的字符。如果使用了-c选项,set1和set2必须都给出。如果-c 与-d选项同时出现,你只能使用set1,其他所有的字符都被删除。

下面的例子从输入文本中删除不在补集中的所有字符:

$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

124

接下来的例子将不在set1中的字符替换成空格:

$ echo hello 1 char 2 next 4 | tr -c '0-9' ' '

1 2 4

3. 用tr压缩字符

tr命令能够完成很多文本处理任务。例如,它可以删除字符串中重复出现的字符。基本实现 形式如下:

tr -s '[需要被压缩的一组字符]'

如果你习惯在点号后面放置两个空格,你需要在不删除重复字母的情况下去掉多余的空格:

$ echo "GNU is not UNIX. Recursive right ?" | tr -s ' ' GNU is not UNIX. Recursive right ?

tr命令还可以用来删除多余的换行符:


用tr以一种巧妙的方式 将文件中的数字列表进行相加:


这招是如何起效的?

在命令中,tr命令将'\n'替换成了'+',我们因此得到了字符串1+2+3+..5+,但是在字符 串的尾部多了一个操作符+。为了抵消这个多出来的操作符,我们再追加一个0。

$[ operation ]执行算术运算,因此就形成了以下命令:echo $[ 1+2+3+4+5+0 ]

如果我们利用循环从文件中读取数字,然后再进行相加,那肯定得用几行代码。有了tr,只 用一行就搞定了。

如果有一个包含字母和数字的文件,我们想计算其中的数字之和,这需要更强的技巧性:


利用tr的-d选项删除文件中的字母,然后将空格替换成+:

$ cat test.txt | tr -d [a-z] | echo "total: $[$(tr ' ' '+')]"

total: 6

4. 字符类

tr可以将不同的字符类作为集合使用,所支持的字符类如下所示。

















「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论