替换或删除字符
tr [-cCdst] str1 [str2] tr [--help] [--version]
tr命令主要用于读取标准输入,替换或删除选择的字符,压缩重复的字符,把处理后的结果写到标准输出。其中,str1与str2是一组有序的字符映射字符串,用作转换、删除或压缩的控制字符串。有关字符串的组成详见下面的说明。
如果没有指定任何选项,但给定了字符串参数str1和str2,则执行字符转换功能。如果输入数据中的字符与字符串str1中指定的任何一个字符相同,使用字符串str2中相应位置上的字符予以替换。在字符转换的情况下,字符串str1和str2的长度应当一致。如果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用于压缩重复的字符。在此情况下,字符串str1与str2不能相同。
下面的例子表示从输入数据中删除空白字符,压缩重复的换行符(实为删除空行)。
tr -ds '[:blank:]' '\n'
在仅仅指定一个“-s”选项的情况下,如果仅指定了一个字符串参数,字符串参数用于压缩重复的字符,把连续的重复字符压缩成单个字符。如果指定了两个字符串参数str1和str2,执行字符串的转换与重复字符的压缩。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 指定按升序排列的字符范围。表示char1至char2范围内的所有字符。
[char*n] n个重复的字符char。数字n若加前置0,说明是一个八进制数值,否则为十进制数值。由于重复的字符主要用于压缩,故只能出现在字符串str2中。如果省略n或n为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