??? 大师教你:shell-tr命令详解 最新365bet官网_365bet娱乐场官网app_365bet官网平台开户网址

会飞的鱼

0791king
江西最好的IT分享社区

大师教你:shell-tr命令详解

关于tr
t r用来从标准输入中通过替换或删除操作进行字符转换。t r主要用于删除文件中控制字符或进行字符转换。使用t r时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。
t r刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。微信截图_20180418143338.png

下面讲述:
" 大小写转换。
" 去除控制字符。
" 删除空行。


带有最常用选项的t r命令格式为:

  1. t?r?-?c?-?d?-?s?[?"?s?t?r?i?n?g?1?_?t?o?_?t?r?a?n?s?l?a?t?e?_?f?r?o?m?"?]???
  2. [?"?s?t?r?i?n?g?2?_?t?o?_?t?r?a?n?s?l?a?t?e?_?t?o?"?]?i?n?p?u?t?_f?i?l?e??
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

I n p u t - f i l e是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

字符范围
使用t r时,可以指定字符串列表或范围作为形成字符串的模式。这看起来很像正则表达式,但实际上不是。指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
/octal 一个三位的八进制数,对应有效的A S C I I字符。
[O*n] 表示字符O重复出现指定次数n。因此[ O * 2 ]匹配O O的字符串。
大部分t r变种支持字符类和速记控制字符。
字符类格式为[:c l a s s ],包含数字、希腊字母、空行、小写、大写、c n t r l键、空格、点记符、图形等等。
下表包括最常用的控制字符的速记方式及三位八进制引用方式。
当用一个单字符替换一个字符串或字符范围时,注意字符并不放在方括号里( [ ])。一些系统也可以使用方括号,例如可以写成[“\ 0 1 2”]或“\ 0 1 2”,t r也允许不加引号,因此命令中看到单引号而不是双引号时也不要感到奇怪。
像大多数系统工具一样, t r也受特定字符的影响。因此如果要匹配这些字符,需使用反斜线屏蔽其特殊含义。例如,用\ {指定花括号左边可以屏蔽其特殊含义。

tr中特定控制字符的不同表达方式

  1. 速记符含义八进制方式??
  2. \?a?Ctrl-G?铃声\?0?0?7??
  3. \?b?Ctrl-H?退格符\?0?1?0??
  4. \f?Ctrl-L?走行换页\?0?1?4??
  5. \n?Ctrl-J?新行\?0?1?2??
  6. \?r?Ctrl-M?回车\?0?1?5??
  7. \t?Ctrl-I?tab键\?0?11??
  8. \?v?Ctrl-X?\?0?3?0??
去除重复出现的字符

下面文件包含了一些打印错误。这种情况时常发生,例如在v i编辑器中,偶尔按住一个键不放。

  1. [sam@chenwy?split]$?cat?opps.txt??
  2. And?the?cowwwwws?went?homeeeeeeeeeeeee??
  3. Or?did?theyyyyyyyyyyyyy??

如果要去除重复字母或将其压缩在一起,使用- s选项。因为都是字母,故使用[ a - z ]。输入文件重定向到t r命令。

  1. [sam@chenwy?split]$?tr?-s?"[a-z]"?
  2. And?the?cows?went?home??
  3. Or?did?they??

所有重复字符被压缩成一个。如果使用c a t命令,再将结果管道输出至t r,结果是一样的。

  1. [sam@chenwy?split]$?cat?opps.txt?|?tr?-s?"[a-z]"??
  2. And?the?cows?went?home??
  3. Or?did?they??
删除空行

要删除空行,可将之剔出文件。下面是一个文件p l a n e . t x t。文本间有许多空行。

  1. [sam@chenwy?split]$?cat?plane.txt??
  2. plane.txt??
  3. 9879932?Spitfire??
  4. ??
  5. ??
  6. ??
  7. ??
  8. 190992?Lancaster??
  9. ??
  10. ??
  11. ??
  12. ??
  13. 238991?Typhoon??

使用- s来做这项工作。换行的八进制表示为\ 0 1 2,命令为:

  1. [sam@chenwy?split]$?tr?-s?"[\012]"?
  2. plane.txt??
  3. 9879932?Spitfire??
  4. 190992?Lancaster??
  5. 238991?Typhoon??

也可以使用换行速记方式\ n。

  1. [sam@chenwy?split]$?tr?-s?"[\n]"?
  2. plane.txt??
  3. 9879932?Spitfire??
  4. 190992?Lancaster??
  5. 238991?Typhoon??
大写到小写
除了删除控制字符,转换大小写是t r最常用的功能。为此需指定即将转换的小写字符[ a - z ]和转换结果[ A - Z ]。

第一个例子,t r从一个包含大小写字母的字符串中接受输入。

  1. [sam@chenwy?split]$?echo?"May?Day,May?Day,Going?Down.."?|?tr?"[a-z]"?"[A-Z]"??
  2. MAY?DAY,MAY?DAY,GOING?DOWN..??

同样,也可以使用字符类[:l o w e r:]和[:u p p e r:]。

  1. [sam@chenwy?split]$?echo?"May?Day,May?Day,Going?Down.."?|?tr?"[:lower:]"?"[:upper:]"??
  2. MAY?DAY,MAY?DAY,GOING?DOWN..??
删除指定字符
偶尔会从下载文件中删除只包含字母或数字的列。需要结合使用- c和- s选项完成此功能。

下面的文件包含一个星期的日程表。任务是从其中删除所有数字,只保留日期。日期有大写,也有小写格式。因此需指定两个字符范围[ a - z ]和[ A - Z ],命令tr -cs "[a-z][A-Z]""[\012*]"将文件每行所有不包含在[ a - z ]或[ A - Z ](所有希腊字母)的字符串放在字符串1中并转换为一新行。- s选项表明压缩所有新行, - c表明保留所有字母不动。原文件如下,后跟t r命令:

  1. [sam@chenwy?split]$?cat?diary.txt??
  2. mondy?10:50??
  3. Tuesday?15:00??
  4. wednesday?15:30??
  5. thurday?10:30??
  6. Fridya?09:20??
  1. [sam@chenwy?split]$?tr?-cs?"[a-z][A-Z]"?"[\012*]"?<>
  2. mondy??
  3. Tuesday??
  4. wednesday??
  5. thurday??
  6. Fridya??
转换控制字符
t r的第一个功能就是转换控制字符,特别是从d o s向U N I X下载文件时,忘记设置f t p关于回车换行转换的选项时更是如此。

下面是故意没有设置转换开关的一个文本文件,是关于文具需求的一部分内容。使用c a t- v显示控制字符。

  1. [sam@chenwy?split]$?cat?-v?stat.tr??
  2. Boxes?paper?????12^M??
  3. Clips?metal?????50^M??
  4. Pencils-meduim??10^M??
  5. ^Z??
猜想‘中间空的是’是t a b键。每一行以C t r l - M结尾,文件结尾C t r l - Z,以下是改动方法。
使用- s选项,查看A S C I I表。^的八进制代码是1 3 6,^ M是0 1 5,t a b键是0 11,^ Z是0 3 2 ,下面将按步骤完成最终功能。

用新行替换每行末尾的^ M,并用\ n去除^ Z,输入要来自于临时工作文件s t a t . t m p。将结果重定向到临时工作文件s t a t . t m p。

  1. [sam@chenwy?split]$?tr?-s?"[\015\032]"?"\n"?stam.tmp??
  2. [sam@chenwy?split]$?cat?-v?stam.tmp??
  3. Boxes?paper?????12??
  4. Clips?metal?????50??
  5. Pencils-meduim??10??
快速转换

如果需要删除文件中^ M,并代之以换行。使用命令:

  1. [sam@chenwy?split]$?tr?-s?"[\015]"?"\n"?
  2. Boxes?paper?????12??
  3. Clips?metal?????50??
  4. Pencils-meduim??10??
  5. ^Z??

或者用下述命令得同样结果。

  1. [sam@chenwy?split]$?tr?-s?"[\015]"?"\n"?stat1.tr??
  2. [sam@chenwy?split]$?cat?stat1.tr??
  3. Boxes?paper?????12??
  4. Clips?metal?????50??
  5. Pencils-meduim??10??

也可以用下述命令:

  1. [sam@chenwy?split]$?tr?-s?"[\r]"?"\n"?
  1. [sam@chenwy?split]$?tr?-s?"\r"?"\n"?

另一个一般的D o s到U N I X转换是命令:

  1. [sam@chenwy?split]$?tr?-s?"[\015\032]"?"[\012*]"?
  2. Boxes?paper?????12??
  3. Clips?metal?????50??
  4. Pencils-meduim??10??
将删除所有^ M和^ Z,代之以换行。

要删除所有的t a b键,代之以空格,使用命令:

  1. [sam@chenwy?split]$?tr?-s?"[\011]"?"[\040*]"?temp.txt??
  2. [sam@chenwy?split]$cat?-v?temp.txt??
  3. Boxes?paper?12^M??
  4. Clips?metal?50^M??
  5. Pencils-meduim?10^M??
  6. ^Z??

替换p a s s w d文件中所有冒号,代之以t a b键,可以增加可读性。将冒号引起来,指定替换字符串中t a b键八进制值0 11,下面是p a s s w d文件,后跟t r命令结果:

  1. [sam@chenwy?split]$?tr?-s?"[:]"?"[\t]"?
  2. root????x???????0???????0???????root????/root???/bin/bash??
  3. bin?????x???????1???????1???????bin?????/bin????/sbin/nologin??
  4. daemon??x???????2???????2???????daemon??/sbin???/sbin/nologin??
  5. .....................??

  1. [sam@chenwy?split]$?tr?-s?"[:]"?"[\011]"?
匹配多于一个字符
可以使用[ c h a r a c t e r * n ]格式匹配多于一个字符。下述文件列出系统硬盘信息,其中包含了系统已经注册的和未识别的。第一列是数字,如果不全是0,表明第二列相应硬盘已经注册。

有时全部为0看起来很烦人,找个吸引人注意力的符号来代替它,以便一眼就能看出哪个硬盘已注册,哪个不可识别。原文件如下:

  1. [sam@chenwy?split]$?cat?hdisk.txt??
  2. 15566?hdisk3??
  3. 456554?hdisk2??
  4. 0000?hdisk1??

从文件列表中知道,有一个硬盘未注册,因此用星号代替所有的0。模式为[ 0 * 4 ],意即匹配至少4个0,替换字符串为星号,过滤命令及结果如下:

  1. [sam@chenwy?split]$?tr?"[0*4]"?"*"?
  2. 15566?hdisk3??
  3. 456554?hdisk2??
  4. ****?hdisk1??

但我发现加上[]后结果不对了

  1. [sam@chenwy?split]$?tr?"[0*4]"?"[*]"?
  2. 15566?hdisk3??
  3. 456554?hdisk2??
  4. ]]]]?hdisk1??

×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:0791king-核动力社区 ? 大师教你:shell-tr命令详解
标签: shell命令

发表评论

表情
看不清楚?点图切换

网友评论(1)

学到老 活到老!
echo 2年前 (2018-04-18) 回复