Linux 命令 - tr

1 tr 简介

tr 命令用来将标准输入(因此,对文件的话只能采用输入重定向或者管道)中的字符串转变为另外一个字符串。tr 命令主要有三种操作,分别为字符集替换,字符集删除,字符集压缩(删除连续重复的字符)。

tr 命令可以看作 sed 命令的一个简化版本。

1.1 基本用法

tr '字符集1' '字符集2' <filename

该命令用于将 filename 中存在于字符集1中的字符替换为字符集2中相应的字符。

字符 存在映射的关系(可能是一对一,也可能是多对一)。比如:字符集1为 aa,字符集2为 <>,此时会发生覆盖,最后 a 会被映射为 >。

如果字符集2的长度小于字符集1的长度,且字符集1多出来的部分中存在某个字符,它还没有被映射。那么字符集1前面的字符(大小等于字符集2的长度)与字符集2中的字符进行映射后,字符集1后面剩余的部分中未被映射的字符将全部被映射为字符集2中的最后一个字符。

1.1.1 字符集

字符集可以是如下的形式:

  • 字符1字符2字符3…。如 \n\t。
  • 字符1-字符k字符m-字符n。如 1-2A-B。
  • [字符*],只用于字符集2(也即只用于替换操作,不能用于删除和压缩操作),此时会存在多对一的关系。例如,假设字符集长度为 m,那么 [a*] 就相当于是连续的 m 个 a。
  • [字符*n],只作用于字符集2,此时会存在多对一的关系。例如,[a*n] 就相当于是连续的 n 个 a。
  • 其他特殊的字符集。比如 [:upper:] 表示所有大写字母,[:lower:] 表示所有小写字母,[:punct:] 表示所有标点符号。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cat filename
    33331111444422220000
    tr '1-2' '[?*]'<filename
    # 1 和 2 均被映射为 ?。
    3333????4444????0000
    tr '1-3' '[?*2]/'<filename
    # 1, 2 均被映射为 ?,3 被映射为 /。
    ////????4444????0000

1.1.2 重定向

由于 tr 命令只接受标准输入,因此需要用到标准输入重定向 >

当然,还可以用管道将一个命令的标准输出当做 tr 命令的标准输入。

1.2 取字符集1的补集

tr -c '字符集1' '字符集2' <filename

将 filename 中存在于字符集1的补集中的字符替换为字符集2中的相应字符。

1.3 不打印字符集中的字符

tr -d '字符集'<filename

1.4 压缩连续重复出现且存在于字符集中的字符

tr -s '字符集'<filename

对于连续重复出现且存在于字符集中的字符,该命令只会打印第一次出现的这个字符。

1
2
3
4
5
cat filename
33331111444422220000
tr -s '1-3'<filename
31444420000

Reference