tr主要用于映射结果集、压缩和删除字符。我个人感觉特别有用,特别是压缩连续空格(空行)为一个空格(空行),让不规则的信息变得规则。

2.5.1 tr映射

tr [options] [SET1] [SET2]

如果同时指定了SET1和SET2,则实现的是将SET1的符号按位置一一对应映射为SET2中的符号。实际上就是对应替换。

tr接收到stdin后首先会把标记意义上的符号替换为换行符,然后才执行指定的选项参数。什么是标记意义上的符号请看xargs的内容http://www.cnblogs.com/f-ck-need-u/p/5925923.html

例如:

[root@xuexi tmp]# ls

a  b  c  d  logdir  one  one space.log  shdir  sh.txt  space.log  test  vmware-root

[root@xuexi tmp]# ls | tr " " "\t"  ç由于先替换为换行符,所以有且只有一个文本意义上的空格被替换为制表符

a

b

c

d

logdir

one

one     space.log

shdir

sh.txt

space.log

test

vmware-root

如果在SET1中使用了\n,会发现最后的结果中是紧接着命令提示符。就像下面的。这就是因为原本最后一行的尾部是有分行符的,替换之后就没有了分行符。

[root@xuexi tmp]# echo {1..10} | tr "\n" "x"

1 2 3 4 5 6 7 8 9 10x[root@xuexi tmp]#

之所以说tr是映射而不是替换,是因为两个结果集替换的时候符号位置是一一对应的。例如下面例子的第二条命令,因为\n是SET1中的唯一一个也是第一个符号位,所以SET2中只取第一个符号位“X”进行替换。Y字符就被忽略了。

[root@xuexi tmp]# ls | tr "\n" "X"

aXbXcXdXlogdirXoneXone space.logXshdirXsh.txtXspace.logXtestXvmware-rootX

[root@xuexi tmp]# ls | tr "\n" "XY"

aXbXcXdXlogdirXoneXone space.logXshdirXsh.txtXspace.logXtestXvmware-rootX

那么这样就可以实现简单的加密和解密了。

[root@xuexi tmp]# echo "12345" | tr "0-9" "9876543210"     ç加密

87654

[root@xuexi tmp]# echo "87654" | tr "0-9" "9876543210"     ç解密

12345

上面的过程是将管道左边的12345对应到0-9的展开式0123456789,并将对应位映射到SET2的数字上。解密也是同理。

更典型的是ROT13加密算法,它的加密和解密使用一套字符。它的SET1的字母位和SET2的字母位完全反向成对。例如SET1指定符号是“axy”,如果SET2想将其对应为“opq”,则须将SET1扩展为“axyopq”,SET2扩展为“opqaxy”,最终是(a,x,y,o,p,q)和(o,p,q,a,x,y),这样(a,o)和(o,a)就配对了,无论加密还是解密都能使用这一套字符。将其扩展为A-Z和a-z就是ROT13加密,甚至还可以将0-9也加上去和9-0对应。下面是SET1和SET2的对应式。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

现在加密“I love you”

[root@xuexi tmp]# echo "I love you" | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"

V ybir lbh

将“V ybir lbh”解密。

[root@xuexi tmp]# echo "V ybir lbh" | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"

I love you

2.5.2 完全对应的替换

默认情况下,当指定的SET1比SET2字符长时,从最后一个对应的位置开始,SET1的剩余字符都和SET2的最后一个字符对应。假如SET1=[1234],SET2=[abc],则3对应c,4也对应c,此时如果tr的操作对象中出现3或者4都会被替换为c。

使用-t可以先截断SET1比SET2中长的字符,例如上面截断多余的4,SET1=[123]和SET2=[abc]就实现了完全对应。

[root@xuexi tmp]# cat x.txt

NO Name SubjectID Mark 备注

1  longshuai 001  56 不及格

2  gaoxiaofang  001 60 及格

3  zhangsan 001 50 不及格

4  lisi    001   80 及格

5  wangwu   001   90 及格

[root@xuexi tmp]# cat x.txt | tr  "fang" "jin"   ç结果中n和g都被替换为了n

NO Nime SubjectID Mirk 备注

1  lonnshuii 001  56 不及格

nioxiiojinn  001 60 及格

3  zhinnsin 001 50 不及格

4  lisi    001   80 及格

5  winnwu   001   90 及格

[root@xuexi tmp]# cat x.txt | tr  -t "fang" "jin"  çg被截断,只对应替换fan为jin

NO Nime SubjectID Mirk 备注

1  longshuii 001  56 不及格

gioxiiojing  001 60 及格

3  zhingsin 001 50 不及格

4  lisi    001   80 及格

5  wingwu   001   90 及格

2.5.3 压缩符号

这功能太爽了。

tr -s [SET1] [SET2]

它可以将指定的连续的SET1的第一个符号压缩并替换为SET2中的第一个,如果不指定SET2就仅仅只压缩。这样可以使结果变得具有固定的格式,传递给其他命令进行文本处理时就方便太多了。

假如x.txt文件中的内容如下,空格有的地方多,有的地方少,也就是说是一个没有格式的文件。

[root@xuexi tmp]# cat x.txt

NO Name SubjectID Mark 备注

1  longshuai 001  56 不及格

2  gaoxiaofang  001 60 及格

3  zhangsan 001 50 不及格

4  lisi    001   80 及格

5  wangwu   001   90 及格

使用tr压缩空格使其变的规则。

[root@xuexi tmp]# cat x.txt | tr -s “" "

NO Name SubjectID Mark 备注

1 longshuai 001 56 不及格

2 gaoxiaofang 001 60 及格

3 zhangsan 001 50 不及格

4 lisi 001 80 及格

5 wangwu 001 90 及格

如果指定SET2,假如替换为-。

[root@xuexi tmp]# cat x.txt | tr -s " " "-"

NO-Name-SubjectID-Mark-备注

1-longshuai-001-56-不及格

2-gaoxiaofang-001-60-及格

3-zhangsan-001-50-不及格

4-lisi-001-80-及格

5-wangwu-001-90-及格

如果指定的SET1或SET2超过1个字符,则两者都只取第一个字符。例如x.txt中的Mark列有两个连续的0,将其替换为a。

[root@xuexi tmp]# cat x.txt | tr -s “"00" "aa"

NO Name SubjectID Mark 备注

1  longshuai a1  56 不及格

2  gaoxiaofang  a1 6a 及格

3  zhangsan a1 5a 不及格

4  lisi    a1   8a 及格

5  wangwu   a1   9a 及格

2.5.4 删除符号和补集

tr -d是删除指定的符号,只能接一个SET1。

[root@xuexi tmp]# cat x.txt | tr -d " "

NONameSubjectIDMark备注

1longshuai00156不及格

2gaoxiaofang00160及格

3zhangsan00150不及格

4lisi00180及格

5wangwu00190及格

tr -c SET1 SET2是求tr操作对象对SET1的补集,然后将补集字符全部替换为SET2。即将tr操作对象中不在SET1中存在的字符替换为SET2的字符。但是SET2如果指定的字符大于1个,则只取最后一个字符作为替换字符。使用-c的时候应该把-c SET1作为一个整体,不要将其分开。

例如:

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao" "y"

ayyyyyoy[root@xuexi tmp]#

上面的是把“abcdefo”除ao的替换为y,即ayyyyyo,但是结果的最后面多了一个y并且紧接着命令提示符。这是因为abcdefo尾部的\n也是ao的补集的一部分,并将其替换为y了。如果不想替换最后的\n,可以在SET1中指定\n。

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "y"

ayyyyyo

如果SET2指定多个字符,将只取最后一个字符作为替换字符。

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "ay"

ayyyyyo

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "yb"

abbbbbo

-c常和-d一起使用,tr -d -c SET1。它先执行-c SET1求出tr操作对象对SET1的补集,再对这个补集执行删除,也就是说最终的结果是SET1类的。注意,-d一定是放在-c前面的,否则执行的就不是删除补集,而是替换补集为-d的最后一个字符d了。

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[0-9]\n"      ç对数字和分行符求补集,并删除这些补集符号

123

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[0-9] \n"     ç多对一个空格求补集,这样结果中就保留空格了

1  2  3

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -c "[0-9]\n" -d      ç -d选项放在-c选项的后面是替换行为

dddd1ddddd2ddddddd3

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[a-zA-z]\n"   ç保留字母

onetwothree

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[a-zA-z] \n"  ç保留字母的同时保留空格

one  two  three

从上面补集的实验中可以看到,其实指定的[0-9]和[a-z]是一个类,最终的结果显示的是这个类中的对象。

在tr中可以使用以下几种类。这些类也可以用在其他某些命令中。

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

[:alpha:]所有的字母

[:blank:]所有水平空白=空格+tab

的del

[:digit:]所有数字

[:graph:]所有打印字符,不包含空格=数字+字母+标点

[:lower:]所有小写字母

[:print:]所有打印字符,包含空格=数字+字母+标点+空格

[:punct:]所有标点符号

[:space:]所有水平或垂直空白=空格+tab+分行符+垂直tab+分页符+回车键

[:upper:]所有大写字母

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

使用方法例如下面的。例如[:upper:]等价于[A-Z],[:digit:]等价于[0-9]。

[root@xuexi tmp]# echo "one ONE 1 two TWO 2 three THREE 3" | tr -d -c "[:upper:] \n"

ONE   TWO   THREE

[root@xuexi tmp]# echo "one ONE 1 two TWO 2 three THREE 3" | tr -d -c "[:alpha:] \n"

one ONE  two TWO  three THREE

[root@xuexi tmp]# echo "one ONE 1 two TWO 2 three THREE 3" | tr -d -c "[:digit:] \n"

1   2   3

SHELL脚本攻略(学习笔记)--2.5 tr的更多相关文章

  1. Linux Shell脚本攻略 读书笔记

    Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...

  2. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  3. Linux Shell脚本攻略学习总结:一

    终端打印 终端打印的常用命令有两个:echo和print 首先,我先介绍echo 1.echo echo这个命令接受三种形式的参数,实例如下: echo "Hello World" ...

  4. linux shell 脚本攻略学习3

    1.Bash中的READ命令 #读取n个字符存入变量 read -n number_of_chars variable_name 示例: amosli@amosli-pc:~$ read -n var ...

  5. linux shell 脚本攻略学习2

    1.关于文件描述符和重定向: 文件描述符是与一个打开的文件或数据流相关联的整数.文件描述符0.1以及2是系统预留的. 0——stdin(标准输入) 1——stdout(标准输出) 2——stderr( ...

  6. linux shell 脚本攻略学习19--sed命令详解

    sed(意为流编辑器,英语“stream editor”的缩写)是Unix/linux常见的命令行程序.sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出,即文本替换.sed通常 ...

  7. Linux Shell 脚本攻略学习--四

    linux中(chattr)创建不可修改文件的方法 在常见的linux扩展文件系统中(如ext2.ext3.ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设 ...

  8. Linux Shell脚本攻略学习总结:三

    根据扩展名切分文件名 首先,我们先来看两个例子: file_jpg="sample.jgp" name=${file_jpg%.*} echo File name is : $na ...

  9. Linux Shell脚本攻略学习总结:二

    比较与测试 程序中的流程控制是由比较和测试语句来处理的. 我们可以用if,if else 以及逻辑运算符来执行测试,而用一些比较运算符来比较数据项.另外,有一个test 命令也可以用来进行测试.让我们 ...

  10. linux shell 脚本攻略学习5---find命令详解

    1.find命令详解 语法: find base_path#base_path可以是任何位置,find会从该位置向下找 实例: amosli@amosli-pc:~$ find /home/amosl ...

随机推荐

  1. 初探groupcache

    groupcache是用于dl.google.com的一个memcached的替代品,相对于memcached,提供更小的功能集和更高的效率,以第三方库的形式提供服务. groupcache的常见部署 ...

  2. Jquery 读取表单选中值

    1.获取复选框的选中值 <title> JS 获取复选框选中的值</title> <script src="jquery-1.11.2.min.js" ...

  3. C++概念整理

    /* 面向对象: 多态, 继承 封装 */ #include <stdio.h> #include <stdlib.h> //一旦有了纯虚函数,该对象就不能实例化了. #def ...

  4. ctype.h / cctype 中的字符函数

    函数名称 返回值 isalnum() 字母或数字 isalpha() 字母 iscntrl() 控制字符 isdigit() 数字(1 ~ 9) isgraph() 除空格之外的打印字符 islowe ...

  5. poj 1363

    这是一道数据结构的问题,用到了栈的知识.题目大意讲的是每一次有N辆车从A到B,但是要将车辆的顺序重新排列,可以通过中转站C来辅助排列,但是C符合先进后出的原则,这一点和栈的特性相同. 整个重新排序的过 ...

  6. 【转载】AngularJs 指令directive之controller,link,compile

    关于自定义指令的命名,你可以随便怎么起名字都行,官方是推荐用[命名空间-指令名称]这样的方式,像ng-controller.不过你可千万不要用 ng-前缀了,防止与系统自带的指令重名.另外一个需知道的 ...

  7. php 单引号 双引号 ,php字符串/ hmtl / 数据库显示/ 及php的几个转化函数

    * 以单引号为定界符的php字符串,支持两个转义\'和\\* 以双引号为定界符的php字符串,支持下列转义(\'会直接输出\' ,也会转义 \\):    \n 换行(LF 或 ASCII 字符 0x ...

  8. world machine, 输出lightmap

    一,输出黑白lightmap: 二,输出彩色lightmap: 需要注意的是:当输出黑白lightmap时,输出设备要用Height Output:当输出彩色lightmap时,输出设备要用Bitma ...

  9. ImageMagick Windows x64下的安装

    在windows下安装ImageMagick时,安装的版本一定要跟php的插件是同一个的,包含vc++编译的版本. 我使用的是ImageMagick-6.9.3-7-Q16-x64-dll.exe 和 ...

  10. Spring学习 Ioc篇(三)

    1.在注解注入方式中,首先要在xml中引入如下的红线的命名空间: <?xml version="1.0" encoding="UTF-8" ?> & ...