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
-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 命令代表 翻译 - translate。 它用于翻译、从大小写相互转换,或者将新行转换为空格。tr 命令也可以删除、压缩文件中的字符,作用非常强大,甚至可用来文字的加密和解密(看下方 ROT13,注意 ROT13 不支持中文)。
ROT 13
tr [-cdst][--help][--version][第一字符集][第二字符集] tr [OPTION]…SET1[SET2] tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
-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 将文件 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,套用加密同样的算法即可得,故同样的操作可用再加密与解密。非常神奇!
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 也是过去在古罗马开发的凯撒加密的一种变体:
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 即实现了加法。