用 tr 过滤文件

没有人曾说过 sed 很容易 — 它确实不容易!但通过使用 tr,您可以非常容易地实现sed 的许多最基本功能。Jacek Artymiak 向您展示如何去做。

您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。

那么,为什么要使用 tr,而不使用 sed 呢?当然是为了使事情简单。例如,如果我们希望用字母“z”来替换出现的所有字母“a”,则可以用 tr a z ,这条命令毫无疑问比 sed -e s/a/z/g 简单,尤其在把它用到脚本中时,其中的引号转义很让人头痛。另外,在使用 tr 时,可以避免写那些让人讨厌的正则表达式。

使用 tr 很简单:使用前面一段中所给出的符号表示法,用一个字符去替换出现的所有另一个字符。当需要替换多个字符时,使用类似于这样的表示法: tr abc xyz ,它表示用字母“x”去替换出现的所有字母“a”,用字母“y”去替换所有字母“b”,用字母“z”去替换所有字母“c”。这两组中所列出的字符的数目不必相等。

您也可以指定字符的范围。例如, tr a-z A-Z 将用对应的大写字母来替换所有的小写字母(例如,它将“no smoking”转换成“NO SMOKING”)。当您在 vi 编辑器中想强调正在编辑的文本的某一部分时,使用这一特殊技巧非常方便。只要按一下 Escape 键,然后按 : 键,再输入 2,4!tr 'a-z' 'A-Z' ,最后按一下 Return 键。现在,从第 2 行到第 4 行的字母就都转换成了大写字母。

另外,当有人给您发送了一个在 Mac OS 或 DOS/Windows 机器上创建的文本文件时,您会发现 tr 非常有用。如果没有将文件保存为使用 UNIX 换行符来表示行结束这种格式,则需要将这样的文件转换成本机 UNIX 格式,否则一些命令实用程序不会正确地处理这些文件。Mac OS 的行尾以回车字符结束,许多文本处理工具将这样的文件作为一行来处理。为了纠正这个问题,可以用下列技巧:

  • Mac -> UNIX: tr '\r' '\n' < macfile > unixfile
  • UNIX -> Mac: tr '\n' '\r' < unixfile > macfile

Microsoft DOS/Windows 约定,文本的每行以回车字符并后跟换行符结束。为了纠正这个问题,可以使用下列命令:

  • DOS -> UNIX: tr -d '\r' < dosfile > unixfile
  • UNIX -> DOS:在这种情况下,需要用 awk ,因为 tr 不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk '{ print $0"\r" }' < unixfile > dosfile

另外,当您需要对文本文件做一些简单的整理工作(如用 tr -d '\t' 除去制表符,用 tr -s ' ' 除去多余的空格,或者用 tr -d '\n' 将分开的几行合成一行)时,会需要用 tr。同样,可以在 vi 内使用所有这些命令;只要记住:在 tr 命令前要加上您希望处理的行范围和感叹号(!),如 1,$!tr -d '\t' (美元符号表示最后一行)中所示。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

jsp基础知识(基本的语法及原理)

     jsp 语法分为三种不同的类型: (1)  编译器指令: 类如: <%@ page import="java.io.*"%> (2)  脚本语法:  ...

29040
来自专栏Python专栏

不会用partial,别说你会python

19780
来自专栏Python中文社区

Python的dict实现原理及与Java的比较探究

Python内部很地方都使用着dict这种结构,在对象属性dict就是一个字典,所以对其效率要求很高。 dict采用了哈希表,最低能在 O(1)时间内完成搜索。...

39960
来自专栏北京马哥教育

一篇文章学会shell工具篇之sed

? sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签 1.首先先来了解一下什么是sed? sed叫...

33370
来自专栏java达人

关于hashmap在多线程环境下的一个小实验

我们都知道hashmap是非线程安全的,平时我们经常是在单线程环境下使用这个类的,现在我们模拟一个多线程环境,并发操作访问一个hashmap实例,看看会出现什么...

34750
来自专栏Java技术分享圈

杨老师课堂之JavaSe 部分面试题

​ JVM 是 JavaVirtual Machine 的缩写,全称是 Java 虚拟机。Java 语言的一个非常重要的 特性就是跨平台性,而 Java 虚...

11030
来自专栏遊俠扎彪

Linux内核代码中max和min宏的实现以及语句表达是({})的应用

Linux内核代码中有很多比较精巧的程序设计技巧,include/linux/kernel.h中实现max和min宏就是其中的一部分。

25450
来自专栏python3

python3--模块collections,time,random,sys

有如下值集合[11,22,33,44,55,66,77,88,99,90......],将所有大于66的值保存至字典的第一个key中,小于66的值保存至第二个k...

10920
来自专栏机器学习从入门到成神

JavaScript之作用域与变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

10420
来自专栏web前端

JavaScript基础学习--08 JS作用域

Demos:   https://github.com/jiangheyan/JavaScriptBase 一、浏览器      1、“JS解析器”(至少分为两...

21750

扫码关注云+社区

领取腾讯云代金券