曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2872|回复: 0
打印 上一主题 下一主题

tr -- 删除或转换字符

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-3-23 20:16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
tr 命令可以用来删除或转换字符。它只接受来自标准输入(stdin)的内容,而不能给它指定命令行参数,下面是语法格式:
tr [OPTION]... SET1 [SET2]
来自标准输入的字符集 SET1 被转换到字符集 SET2,然后将转换结果输出到标准输出(stdout)。  

如果 SET1 的长度大于 SET2 的长度,那么转换后 SET2 的长度会拉长到和 SET1 一样的长度,它是用 SET2 中最后一个字母来补齐这个长度的,如:
# echo 12345 | tr '12345' '123'
12333

反过来,如果 SET1 的长度小于 SET2 的长度,那么所有 SET2 中超出 SET1 的那部分长度都将被忽略掉,如:
# echo 12345 | tr '123' '6789abc'
67845
1. 将大写转换为小写
# echo "WWW.GROAD.NET" | tr 'A-Z' 'a-z'
www.groad.net

2. 简单的加密解密
使用 tr 可以实现简单的加密解密。加密:
# echo 01234 | tr '0-9' '9876543210'
98765
解密:
# echo 98765 | tr '9876543210' '0-9'
01234
对比替换,可以看到加密解密过程非常简单。

可以将上例简单的改变一下:
# echo 12345 | tr '0-9' '9876543210'
87654
然后:
# echo 87654 | tr '9876543210' '0-9'12345
上面这个例子中,替换的过程是:在 12345 通过管道后,tr 首先检查 '0-9' 中的 0 是否存在于 12345,不存在,则对应于 '9876543210' 中的 9 也不会产生替换,因此下移一位。继续检查 '0-9' 中的 1 是否存在于 12345,存在,那么对应于 '876543210' 中的 8 将 1 替换掉。后面几个数字类推。

下面使用 tr 来实现一个 ROT13 的加密解密。ROT13 是一个广为人知的简单算法,简单的说,对于 a-z 中任一字母,只要用它后面的第 13 个字母替换即可,可以产生回绕。下面举例说明,加密:
root@bt:~# echo "groad" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
tebnqroot@bt:~# echo "tebnq" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
groad

3. 将 tab 替换为 ' '
# cat tmp.txt hello    linux    shell
cat tmp.txt | tr '\t' ' 'hello linux shell
4. 使用 -d 选项来删除字符
# echo "hello 0898 groad.net" | tr -d '0-9'
hello  groad.net

5. 使用 -c 选项做补足保留
# echo "hello 0898 groad.net {} ()" |tr -d -c "0-9 \n"
0898   
-c 选项的作用是补足保留,比如上面指定数字,空格以及换行保留,其它的均删除。

6. 使用 -s 选项将重复内容压缩
# echo "welcome   to       groad.net   " | tr -s ' '
welcome to groad.net
上面,将单词间的重复空格压缩成一个。

7. 使用 tr 来做一个加法运算
测试文本内容:
# cat tmp.txt
1
3
5
7
9
11
运行下面的命令:
# cat tmp.txt | echo $[ $(tr '\n' '+' ) 0 ]
36
上面的工作原理是:tmp.txt 中的内容顺序通过管道输入到 tr ,在 tr 中将换行符替换为加号,因此 $(tr '\n' + )的内容变为 1+3+5+7+9+11+ ,多了 1 个加号,因此在后面附带上一个 0,于是成为: 1+3+5+7+9+11+0,这样就可以算得文本中数字的相加结果了。如果写成循环,可能需要几行代码,但这里只需要一行,显得较为简洁。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 19:50 , Processed in 0.084054 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表