参考:
http://fyan.iteye.com/blog/1172279
简介
tr是translate的简写,亦即翻译,但是遗憾的是,它不能翻译句子,只能翻译单个字符。
tr的工作原理是什么?
先记住一点,tr命令不接受指定的文件参数,而只是对标准输入进行翻译。好了,记住这点后,我们继续。
tr的命令格式是tr SET1 SET2,凡是在SET1中的字符,都会被替换为SET2中相应位置上的字符,简单吧!
举个例子吧!
tr的例子其实都大同小异,看一个最简单的例子:
我们有一个包含了四个人身高的数据文件,名字叫height.txt,它的内容是这样的:
1 | printf '1.79 1.83 |
我们想搞一个恶作剧,将所有人的身高从1米级别都提高到2米级别,呵呵,一个tr就可以搞定。1
2
3
4tr 1 2 < height.txt
2.79 2.83
2.65 2.59
希望你没有忘记,tr只处理标准输入,所以我们需要将height.txt通过重定向指到tr的标准输入才可以。
我们可以用tr来修改文件中的间隔符么?
1 | tr ' ' '\11' < height.txt | sed -n l |
这里有一个小知识点,像制表符、换行符这些字符不好表示,我们可以考虑使用ASCII的八进制形式来表示,制表符的八进制形式是11,回车是15,换行是12。而在tr命令中,可以使用\nnn形式表示八进制形式的字符。如果你实在记不住这些编号,那么用\t表示制表符你总该可以记住吧!(\n代表新行, \r代表回车)
1 | sed -n l # l 是什么意思? |
参考:
https://www.cnblogs.com/ctaixw/p/5860221.html
l 显示与八进制ACSII代码等价的控制符
使用tr能把文章中的小写都转换成大写
1 |
|
[CHAR*]怎么用?
这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
1 | echo 1234567890 | tr '[:digit:]' '[A*]' |
[CHAR*REPEAT]怎么用?
这也是SET2专用的设定,功能是将CHAR重复REPEAT次数。其中REPEAT次数可以用八进制数表示,但记得要以0开头表示八进制数。
1 | echo 1你2好3吗4世5界67890 | tr '1-9' '[A*5]BCDE' |
在tr中还有哪些表示集合的符号呢?
1 | [:alnum:] :所有字母字符与数字 |
1 | #将所有的数字都转换为字符x。 |
tr里面包含SET1和SET2,那如果出现两个集合的大小不同的情况,tr如何处理呢?
第一种情况是SET1>SET2:
1 | echo 0,1,2,3,4,5,6,7,8,9 | tr '1-5' 'AB' |
1 | 结论一下子就出来了,SET1中多出来的字符都会和SET2中最后一个字符相对应。 |
第二种情况SET1<SET2:
1 | echo 0,1,2,3,4,5,6,7,8,9 | tr '1-3' 'ABCDE' |
1 | 很明了,SET2中多余的部分将被抛弃。 |
-S参数用法
这个-s选项,是专门针对SET1起作用的,意思是如果发现有连续的SET1里的字符,就把它们缩减为1个。
一个很经典的应用就是把不规律的空格缩减为一个空格:
1 | printf 'How are you? |
1 | tr -s ' ' ' ' < spaces.txt |
-d选项咋用?
-d选项是用来删除字符用的。格式是这样的:1
tr -d charset
1 | tr -d ' ' < spaces.txt |
看,该有的空格都没了…这就是-d的作用,把空格都删除了!
如果你想把文章中的数字都删除,就1
tr -d [0-9] < filename
就可以了。
语法:
1 | tr [options] [source-char-list] [replace-char-list] < filename |
用途:
转换字符,例如:将大写字符转换成小写字符。选项可以让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个。
常用选项:1
-c: 取source-char-list的反义,所有不在source-char-list中的字符。常与-d , -s配合使用。
-d: 删除source-char-list中所定义的字符。1
-s: 浓缩重复的字符。如果标准输入中连续重复出现source-char-list里所列的字符,则将其浓缩成一个。或者将其浓缩成replace-char-list中的字符。
tr ‘X’ ‘x’ 把所有大写X转换成小写x1
tr '()' '{}' 把( )替换成{ }
tr ‘[a-z]’ ‘[A-Z]’ 把所有小写字母变成大写字母
tr ‘[A-Z]’ ‘[N-ZA-M]’ 把字符A-M分别转换成N-Z,而N-Z转换成A-M
tr -s ‘ ‘ ‘ ‘ 把多个空格转换成单个空格
tr -d ‘[0-9]’ 删除所有数字
引用:[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
代码:
速记符含义八进制方式1
2
3
4
5
6
7\a Ctrl-G 铃声 \007
\b Ctrl-H 退格符 \010
\f Ctrl-L 走行换页 \014
\n Ctrl-J 新行 \012
\r Ctrl-M 回车 \015
\t Ctrl-I tab键 \011
\v Ctrl-X \030
如果要去除重复字母或将其压缩在一起,使用-s选项。因为都是字母,故使用[a-z][A-Z]
。输入文件重定向到tr命令。1
2
3
4
5
6
7echo 'success different
And the cowwwwws went homeeeeeeeeeeeee
Or did theyyyyyyyyyyyyy' | tr -s "[a-zA-Z]"
suces diferent
And the cows went home
Or did they
注: 小心使用 success 会变成 suces
删除空行
1 | echo '9879932 Spitfire |
大写到小写
除了删除控制字符,转换大小写是tr最常用的功能。为此需指定即将转换的小写字符[a-z]和转换结果[A-Z]。
第一个例子,tr从一个包含大小写字母的字符串中接受输入。
1 | #tr "[a-z]" "[A-Z]" 或者 tr "[:lower:]" "[:upper:]" |
删除指定字符
1 | 偶尔会从下载文件中删除只包含字母或数字的列。需要结合使用-c和-s选项完成此功能。 |
1 | echo 'success different |