tr 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

tr 命令安装:


-bash/zsh: tr: command not found

# Windows (WSL2)
sudo apt-get update sudo apt-get install coreutils

# Debian
apt-get install coreutils

# Ubuntu
apt-get install coreutils

# Alpine
apk add coreutils

# Arch Linux
pacman -S coreutils

# Kali Linux
apt-get install coreutils

# CentOS
yum install coreutils

# Fedora
dnf install coreutils

# OS X
brew install coreutils

# Raspbian
apt-get install coreutils

tr 命令补充说明:


tr 命令代表 翻译 - translate。 它用于翻译、从大小写相互转换,或者将新行转换为空格。tr 命令也可以删除、压缩文件中的字符,作用非常强大,甚至可用来文字的加密和解密(看下方 ROT13,注意 ROT13 不支持中文)。


ROT 13

tr 命令语法:


tr [-cdst][--help][--version][第一字符集][第二字符集]  
tr [OPTION]…SET1[SET2] 

tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file

tr 命令选项:


-c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d, --delete:删除指令字符
-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
-t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
--help:显示程序用法信息
--version:显示程序本身的版本信息

---------------------------------------
字符集合的范围:
---------------------------------------

\NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
\\ 反斜杠
\a Ctrl-G 铃声
\b Ctrl-H 退格符
\f Ctrl-L 走行换页
\n Ctrl-J 新行
\r Ctrl-M 回车
\t Ctrl-I tab键
\v Ctrl-X 水平制表符
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
[CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
[:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有数字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小写字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
[:upper:] :所有大写字母
[:xdigit:] :所有 16 进位制的数字
[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)

tr 命令实例:


tr 将文件 file 中出现的 abc 替换为 xyz

[root@CommandNotFound]$ cat t.txt 
abc

[root@CommandNotFound]$ cat t.txt |tr "abc" "xyz"
xyz

[root@CommandNotFound]$ cat t.txt 
abc

tr 命令来 统一 修改字母大小写:

[root@CommandNotFound]$ cat file
abc

[root@CommandNotFound]$ cat file|tr [a-z] [A-Z]
ABC

tr 命令,把文件中的数字 0-9 替换为 a-j

cat file|tr [0-9] [a-j]

tr 删除文件 file 中出现的 CommandNotFound 字符:

cat file|tr -d "CommandNotFound"

tr 删除文件 file 中出现的换行 \n、制表 \t 字符:

cat file | tr -d "\n\t"

tr 删除空行:

cat file | tr -s "\n" > new_file

tr 删除 Windows 文件 \r 造成的 ^M 字符:

cat file | tr -d "\r"

或者

cat file | tr -s "\r" "\n"

tr 用空格符 \040 替换制表符 \011

cat file | tr -s "\011" "\040"

tr 把路径变量中的冒号 :,替换成换行符 \n

echo $PATH | tr -s ":" "\n"

tr 命令,实现加密解密:

echo 12345|tr '0-9' '987654321'  ## 加密

echo 87654|tr '987654321' '0-9'  ## 解密

这是一个非常有趣的小例子,通过映射来实现简单的加密解密,看懂这个例子,可以接着往下看古罗马时期发明的凯撒加密的一种变体 ROT13

# tr 加密
echo "hi,this is amosli" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

# 上面命令加密后输出:
uv,guvf vf nzbfyv

--------------------------
# tr 解密
echo "uv,guvf vf nzbfyv" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

# 上面命令还原输出:
hi,this is amosli

ROT13 就是它自己本身的逆反;也就是说,要还原 ROT13,套用加密同样的算法即可得,故同样的操作可用再加密与解密。非常神奇!

ROT 13 扩展阅读:


ROT13(回转13位,英语:rotate by 13 places,有时也记为ROT-13)是一种简易的替换式密码。ROT13 是一种在英文网络论坛用作隐藏八卦(spoiler)、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13 被描述成“杂志字谜上下颠倒解答的 Usenet 点对点体”。(Usenet equivalent of a magazine printing the answer to a quiz upside down.)[1] ROT13 也是过去在古罗马开发的凯撒加密的一种变体:

ROT13 是它自己本身的逆反;也就是说,要还原 ROT13,套用加密同样的算法即可得,故同样的操作可用再加密与解密。该算法并没有提供真正的密码学上的保全,故它不应该被套用在需要保全的用途上。它常常被当作弱加密示例的典型。ROT13 激励了广泛的在线书信撰写与字母游戏,且它常于新闻组对话中被提及。

tr 命令字符集补集 tr -c [set1] [set2],set1 的补集,意味着从这个集合中包含 set1 中没有的所有字符。最典型的用法就是从输入文本中将不在补集中的所有字符全部删除:

echo "hello 123 world " | tr -d -c '0-9 \n'

# 上面 tr 命令输出:
123

在这里,补集中包含了除数字、空格字符和换行符之外的所有字符,因为指定了-d,所以这些字符全部都会被删除。

tr 命令压缩字符,使用 -s 参数可以压缩字符串中重复的字符:

[root@CommandNotFound]$ echo "GNU is  not          UNIX . Recursicve right?" | tr -s  ' '

# 输出
GNU is not UNIX . Recursicve right?

tr 命令实现加法运算:

[root@CommandNotFound]$ cat sum.txt 
5
4
3
5
4
3

[root@CommandNotFound]$ cat sum.txt|echo $[ $(tr '\n' '+') 0 ]

# tr 命令输出(加法运算):
24

[root@CommandNotFound]$ cat sum.txt|echo $[ $(tr '\n' '+') ]  
-bash: 5+4+3+5+4+3+ : syntax error: operand expected (error token is "+")

上面 tr 命令,实现了加法运算, tr '\n' '+' 使用换行符来替换为 + 然后连接起来,最后多出来一个 + 再接上数字 0 即实现了加法。

tr 命令扩展阅读:




tr 命令评论