当前位置: 首页 > news >正文

shell命令_tr基础

关于tr

去除^M部分还需要验证......
t r用来从标准输入中通过替换或删除操作进行字符转换。t r主要用于删除文件中控制字符或进行字符转换。使用t r时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。
t r刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始
下面讲述:
引用:
? 大小写转换。
? 去除控制字符。
? 删除空行。


带有最常用选项的t r命令格式为:
代码:
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 " ] [ " 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中特定控制字符的不同表达方式
代码:
速记符含义八进制方式
/ a Ctrl-G 铃声/ 0 0 7
/ b Ctrl-H 退格符/ 0 1 0
/f Ctrl-L 走行换页/ 0 1 4
/n Ctrl-J 新行/ 0 1 2
/ r Ctrl-M 回车/ 0 1 5
/t Ctrl-I tab键/ 0 11
/ v Ctrl-X / 0 3 0

去除重复出现的字符
下面文件包含了一些打印错误。这种情况时常发生,例如在v i编辑器中,偶尔按住一个键不放。
代码:
[sam@chenwy split]$ cat opps.txt
And the cowwwwws went homeeeeeeeeeeeee
Or did theyyyyyyyyyyyyy


如果要去除重复字母或将其压缩在一起,使用- s选项。因为都是字母,故使用[ a - z ]。输入文件重定向到t r命令。
代码:
[sam@chenwy split]$ tr -s "[a-z]" < opps.txt
And the cows went home
Or did they


所有重复字符被压缩成一个。如果使用c a t命令,再将结果管道输出至t r,结果是一样的。
代码:
[sam@chenwy split]$ cat opps.txt | tr -s "[a-z]"
And the cows went home
Or did they


删除空行
要删除空行,可将之剔出文件。下面是一个文件p l a n e . t x t。文本间有许多空行。
代码:
[sam@chenwy split]$ cat plane.txt
plane.txt
9879932 Spitfire


190992 Lancaster


238991 Typhoon


使用- s来做这项工作。换行的八进制表示为/ 0 1 2,命令为:
代码:
[sam@chenwy split]$ tr -s "[/012]" < plane.txt
plane.txt
9879932 Spitfire
190992 Lancaster
238991 Typhoon


也可以使用换行速记方式/ n。
代码:
[sam@chenwy split]$ tr -s "[/n]" < plane.txt
plane.txt
9879932 Spitfire
190992 Lancaster
238991 Typhoon


大写到小写
除了删除控制字符,转换大小写是t r最常用的功能。为此需指定即将转换的小写字符[ a - z ]和转换结果[ A - Z ]。
第一个例子,t r从一个包含大小写字母的字符串中接受输入。
代码:
[sam@chenwy split]$ echo "May Day,May Day,Going Down.." | tr "[a-z]" "[A-Z]"
MAY DAY,MAY DAY,GOING DOWN..


同样,也可以使用字符类[:l o w e r:]和[:u p p e r:]。
代码:
[sam@chenwy split]$ echo "May Day,May Day,Going Down.." | tr "[:lower:]" "[:upper:]"
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命令:
代码:
[sam@chenwy split]$ cat diary.txt
mondy 10:50
Tuesday 15:00
wednesday 15:30
thurday 10:30
Fridya 09:20


代码:
[sam@chenwy split]$ tr -cs "[a-z][A-Z]" "[/012*]" <diary.txt
mondy
Tuesday
wednesday
thurday
Fridya


转换控制字符
t r的第一个功能就是转换控制字符,特别是从d o s向U N I X下载文件时,忘记设置f t p关于回车换行转换的选项时更是如此。
下面是故意没有设置转换开关的一个文本文件,是关于文具需求的一部分内容。使用c a t- v显示控制字符。
代码:
[sam@chenwy split]$ cat -v stat.tr
Boxes paper 12^M
Clips metal 50^M
Pencils-meduim 10^M
^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。
代码:
[sam@chenwy split]$ tr -s "[/015][/032]" "/n" <stat.tr >stam.tmp
[sam@chenwy split]$ cat -v stam.tmp
Boxes paper 12
Clips metal 50
Pencils-meduim 10


快速转换
如果需要删除文件中^ M,并代之以换行。使用命令:
代码:
[sam@chenwy split]$ tr -s "[/015]" "/n" < stat.tr |cat -v
Boxes paper 12
Clips metal 50
Pencils-meduim 10
^Z


或者用下述命令得同样结果。
代码:
[sam@chenwy split]$ tr -s "[/032]" "/n" < stat.tr >stat1.tr
[sam@chenwy split]$ cat stat1.tr
Boxes paper 12
Clips metal 50
Pencils-meduim 10


也可以用下述命令:
代码:
[sam@chenwy split]$ tr -s "[/r]" "/n" < stat.tr


代码:
[sam@chenwy split]$ tr -s "/r" "/n" < stat.tr

要删除所有的t a b键,代之以空格,使用命令:
代码:
[sam@chenwy split]$ tr -s "[1]" "[0*]" < stat.tr >temp.txt
[sam@chenwy split]$cat -v temp.txt
Boxes paper 12^M
Clips metal 50^M
Pencils-meduim 10^M
^Z


替换p a s s w d文件中所有冒号,代之以t a b键,可以增加可读性。将冒号引起来,指定替换字符串中t a b键八进制值0 11,下面是p a s s w d文件,后跟t r命令结果:
代码:
[sam@chenwy split]$ tr -s "[:]" "[/t]" < passwd
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /sbin/nologin
daemon x 2 2 daemon /sbin /sbin/nologin
.....................



代码:
[sam@chenwy split]$ tr -s "[:]" "[1]" < passwd


匹配多于一个字符
可以使用[ c h a r a c t e r * n ]格式匹配多于一个字符。下述文件列出系统硬盘信息,其中包含了系统已经注册的和未识别的。第一列是数字,如果不全是0,表明第二列相应硬盘已经注册。
有时全部为0看起来很烦人,找个吸引人注意力的符号来代替它,以便一眼就能看出哪个硬盘已注册,哪个不可识别。原文件如下:
代码:
[sam@chenwy split]$ cat hdisk.txt
15566 hdisk3
456554 hdisk2
0000 hdisk1


从文件列表中知道,有一个硬盘未注册,因此用星号代替所有的0。模式为[ 0 * 4 ],意即匹配至少4个0,替换字符串为星号,过滤命令及结果如下:
代码:
[sam@chenwy split]$ tr "[0*4]" "*" < hdisk.txt
15566 hdisk3
456554 hdisk2
**** hdisk1


但我发现加上[]后结果不对了
代码:
[sam@chenwy split]$ tr "[0*4]" "[*]" < hdisk.txt
15566 hdisk3
456554 hdisk2
]]]] hdisk1

相关文章:

  • 【数据库系列_概念】1数据库概念学习——基本概念术语
  • 如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
  • test命令用法。功能:检查文件和比较值
  • iOS项目之模拟请求数据
  • [转]你可能不知道的10个JavaScript小技巧
  • Cobbler自动装机--2
  • shell 空格
  • bzoj 1189: [HNOI2007]紧急疏散evacuate
  • 项目总结
  • 资源更新服务器
  • shell脚本专家指南笔记----shell错误调试
  • SpringBoot学习:整合Redis
  • vs20008 新特性复习
  • 分布式技术追踪 2017年第十四期
  • HighID
  • 2017届校招提前批面试回顾
  • Cumulo 的 ClojureScript 模块已经成型
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IDEA常用插件整理
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • java 多线程基础, 我觉得还是有必要看看的
  • js递归,无限分级树形折叠菜单
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SQLServer之创建数据库快照
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • web标准化(下)
  • 成为一名优秀的Developer的书单
  • 大主子表关联的性能优化方法
  • 解析 Webpack中import、require、按需加载的执行过程
  • 力扣(LeetCode)21
  • 聊聊hikari连接池的leakDetectionThreshold
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何实现 font-size 的响应式
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用 QuickBI 搭建酷炫可视化分析
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # centos7下FFmpeg环境部署记录
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)(1.13) SiK无线电高级配置(五)
  • (13)Hive调优——动态分区导致的小文件问题
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ../depcomp: line 571: exec: g++: not found
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...