tr

替换或删除字符


语法格式

tr [-cCdst] str1 [str2]
tr [--help] [--version]

命令简介

tr命令主要用于读取标准输入,替换或删除选择的字符,压缩重复的字符,把处理后的结果写到标准输出。其中,str1str2是一组有序的字符映射字符串,用作转换、删除或压缩的控制字符串。有关字符串的组成详见下面的说明。

如果没有指定任何选项,但给定了字符串参数str1str2,则执行字符转换功能。如果输入数据中的字符与字符串str1中指定的任何一个字符相同,使用字符串str2中相应位置上的字符予以替换。在字符转换的情况下,字符串str1str2的长度应当一致。如果str1长于str2,重复str2的最后一个字符,直至str2的长度与str1相同。如果str2长于str1,忽略str2后面的超长部分。

例如,下面3种用法均表示把输入数据中的小写字母转换成相应位置的大写字母。

tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
tr a-z A-Z
tr '[:lower:]' '[:upper:]'

如果仅指定了“-c”或“-C”选项,首先使用字符串str1指定字符串的补集(LC_CTYPE定义的当前字符集中除str1指定字符之外的所有字符的集合),按照升序替换str1中原有的字符串,然后再执行字符转换。

在下面的例子中,首先使用非字母数字替换str1,然后执行字符串转换,把输入数据中的非字母数字转换成换行符。

tr -c '[:alnum:]' '[\n*]'

如果仅指定了“-d”选项,表示删除输入数据中与字符串str1指定字符相同的字符。如果同时指定了“-d”与“-c”或“-C”选项,意味着保留str1中指定的字符,删除输入数据中的其他任何字符(此时不应提供str2参数,除非指定了“-s”选项)。

例如,下面第一个例子表示删除输入数据中的回车字符。第二个例子表示仅保留数字,删除其他任何字符。

tr -d '\r'
tr -cd '[:digit:]'

如果同时指定了“-d”与“-s”选项,str1用于删除指定的字符,str2用于压缩重复的字符。在此情况下,字符串str1str2不能相同。

下面的例子表示从输入数据中删除空白字符,压缩重复的换行符(实为删除空行)。

tr -ds '[:blank:]' '\n'

在仅仅指定一个“-s”选项的情况下,如果仅指定了一个字符串参数,字符串参数用于压缩重复的字符,把连续的重复字符压缩成单个字符。如果指定了两个字符串参数str1str2,执行字符串的转换与重复字符的压缩。str2兼具两方面的任务,一是指定字符串转换的映射字符,二是表示需要压缩的重复字符。

例如,下面第一个例子表示把多个连续的换行符压缩成单个换行符。第二个例子表示首先把空白字符转换成换行符,最后压缩重复的换行符。

tr -s '\n'
tr -s '[:blank:]' '[\n*]'

命令选项

-c, -C, --complement  使用str1指定字符集的补集(目前tr仅支持单字节的字符,故表示字节的“-c”与表示字符的“-C”选项暂不做区分)。

-d, --delete  从输入数据中删除字符串str1中指定的所有字符,不做转换。

-s, --squeeze-repeats  针对str1中列举的任何字符,如果输入数据中存在相应的重复字符序列,则使用单个字符替换重复的字符序列。

-t, --truncate-set1  把字符串str1截成与str2相同的长度。注意,这个选项只能用于字符转换。

字符串

每个字符串由一组字符组成,用于字符的映射,实现字符的转换、删除或压缩。在指定字符串时,可以使用普通字符、转义字符、字符范围和字符类别等:

char  任何一个普通字符。

\nnn  采用1~3位八进制数字表示的字符。

\char  转义字符,如“\a”(警示音)、“\b”(退格符)、“\f”(换页符)、“\n”(换行符)、“\r”(回车)、“\t”(制表符)、“\v”(纵向制表符)和“\\”(反斜线)等。

char1-char2  指定按升序排列的字符范围。表示char1char2范围内的所有字符。

[char*n]  n个重复的字符char。数字n若加前置0,说明是一个八进制数值,否则为十进制数值。由于重复的字符主要用于压缩,故只能出现在字符串str2中。如果省略nn为0,表示扩展字符串str2,使之具有与str1等同的长度。

[:class:]  预定义的字符类别,用于表示一个字符范围:

[:alnum:]  所有的字母和数字。

[:alpha:]  所有的字母。

[:blank:]  所有的横向空白字符,如空格或制表符等。

[:cntrl:]  所有的控制字符。

[:digit:]  所有的数字。

[:graph:]  所有的可打印字符,但不包括空格。

[:lower:]  按升序排列的小写字母集合。

[:print:]  所有的可打印字符,包括空格。

[:punct:]  所有的标点符号字符。

[:space:]  所有的横向或纵向空白字符,包括换行符。

[:upper:]  按升序排列的大写字母集合。

[:xdigit:]  所有的十六进制数字。

[=char=]  等价于指定字符char的所有字符。

注意,在同时指定“-d”与“-s”选项的情况下,任何字符类别均可出现在str2中,否则只有大小写字母类别能够出现在str2中,对应的字母类别可以出现在str1中,用于实现字母的大小写转换。例如,当使用[:lower:]作为str1,[:upper:]作为str2时,表示把输入数据中的所有小写字母转换成大写字母。反之,当使用[:upper:]作为str1,[:lower:]作为str2时,表示把输入数据中的所有大写字母转换成小写字母。

应用实例

1. 删除输入文件中的回车字符,把结果写到指定的文件中。

$ tr -d '\r' < dosfile
This is a dos file
From Windows XP
$

2. 使用制表符替代/etc/passwd文件中的冒号,写到标准输出。

$   tr ':' '\t' < /etc/passwd
root    x       0       0       root    /root   /bin/bash
bin     x       1       1       bin     /bin    /sbin/nologin

3. 把file1中的所有小写字母转换成大写字母,写到标准输出。

$ tr "[:lower:]" "[:upper:]" <file1

4. 从输入文件file1中抽取一组由连续的字母构成的最大字符串,一行一个写入file2中(首先把非字母转换成换行符,然后把重复的换行符压缩成单个换行符)。

$ tr -cs "[:alpha:]" "[\n*]" <file1 >file2

索引: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