shell tr 命令

2023-11-11

tr是translate的简写,亦即翻译,但是遗憾的是,它不能翻译句子,只能翻译单个字符。

1 tr的工作原理是什么?

先记住一点,tr命令不接受指定的文件参数,而只是对标准输入进行翻译。
tr的命令格式是tr SET1 SET2,凡是在SET1中的字符,都会被替换为SET2中相应位置上的字符,简单吧!

2 举个例子吧!

tr的例子其实都大同小异,看一个最简单的例子:

我们有一个包含了四个人身高的数据文件,名字叫height.txt,它的内容是这样的:

[rocrocket@rocrocket programming]$ cat height.txt
1.79 1.83
1.65 1.59

我们想搞一个恶作剧,将所有人的身高从1米级别都提高到2米级别,呵呵,一个tr就可以搞定。
[rocrocket@rocrocket programming]$ tr 1 2 < height.txt
2.79 2.83
2.65 2.59

希望你没有忘记,tr只处理标准输入,所以我们需要将height.txt通过重定向指到tr的标准输入才可以。

3 我们可以用tr来修改文件中的间隔符么?

Good idea!

当使用cut的时候,通常会被间隔符问题所困扰,我们这个时候可以考虑到tr这个命令。

还是以height.txt文件为例,其中的间隔符是空格,我们把它修改为制表符吧!

[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘\11′ < height.txt
1.79    1.83
1.65    1.59

这里有一个小知识点,像制表符、换行符这些字符不好表示,我们可以考虑使用ASCII的八进制形式来表示,制表符的八进制形式是11,回车是15,换行是12。而在tr命令中,可以使用\nnn形式表示八进制形式的字符。如果你实在记不住这些编号,那么用\t表示制表符你总该可以记住吧!(\n代表新行,\r代表回车)

这下,你应该可以理解上面那条命令的作用了吧。如果你仍然怀疑,那么,看看下面这条命令,你就该心服口服了:

[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘\11′ < height.txt |sed -n l
1.79\t1.83$
1.65\t1.59$

看!空格的的确确被替换成了制表符喽!

4 使用tr能把文章中的小写都转换成大写么?

这个正是tr所擅长的地方。

加入我们拥有一个文件叫做word.txt,里面包含的内容是AbcdE。

那么最简单的替换大小写的方法是:

[rocrocket@rocrocket programming]$ cat word.txt
AbcdE
[rocrocket@rocrocket programming]$ tr ‘a-z’ ‘A-Z’ < word.txt
ABCDE

5 [CHAR*]怎么用?

这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止

例子:

[rocrocket@rocrocket programming]$ cat number.txt
1234567890
[rocrocket@rocrocket programming]$ tr ‘1-5′ ‘[A*]‘ < number.txt
AAAAA67890

6 [CHAR*REPEAT]怎么用?

这也是SET2专用的设定,功能是将CHAR重复REPEAT次数。其中REPEAT次数可以用八进制数表示,但记得要以0开头表示八进制数。

例子:

[rocrocket@rocrocket programming]$ tr ‘1-9′ ‘[A*5]BCDE’ < number.txt
AAAAABCDE0

7 在tr中还有哪些表示集合的符号呢?

[:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有数字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小写字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
[:upper:] :所有大写字母
[:xdigit:] :所有 16 进位制的数字

例子:

将所有的数字都转换为字符x。

[rocrocket@rocrocket programming]$ tr [:alnum:] ‘[x*]‘ < number.txt
xxxxxxxxxx

8 tr里面包含SET1和SET2,那如果出现两个集合的大小不同的情况,tr如何处理呢?

这个问题,最好的解决办法就是做实验啊。

第一种情况是SET1>SET2:

[rocrocket@rocrocket programming]$ tr 1-5 AB < number.txt
ABBBB67890

结论一下子就出来了,SET1中多出来的字符都会和SET2中最后一个字符相对应。

第二种情况SET1<SET2:

[rocrocket@rocrocket programming]$ tr 1-3 ABCDE < number.txt
ABC4567890

很明了,SET2中多余的部分将被抛弃。

9 讲一讲tr命令的-s选项吧!

这个-s选项,是专门针对SET1起作用的,意思是如果发现有连续的SET1里的字符,就把它们缩减为1个。

一个很经典的应用就是把不规律的空格缩减为一个空格:

[rocrocket@rocrocket programming]$ cat spaces.txt
How   are               you?
Fine! Thank    you!
[rocrocket@rocrocket programming]$ tr -s ‘ ‘ ‘ ‘ < spaces.txt
How are you?
Fine! Thank you!

效果很明显,用户很满意。恩!

10 -d选项咋用?

-d选项是用来删除字符用的。格式是这样的:tr -d charset

[rocrocket@rocrocket programming]$ tr -d ‘ ‘ < spaces.txt
Howareyou?
Fine!Thankyou!

看,该有的空格都没了…这就是-d的作用,把空格都删除了!

如果你想把文章中的数字都删除,就tr -d [0-9] < filename就可以了。





语法:
          tr [options]   [source-char-list]        [replace-char-list]      <    filename
用途:
    转换字符,例如:将大写字符转换成小写字符。选项可以让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个。
常用选项:
-c:   取source-char-list的反义,所有不在source-char-list中的字符。常与-d , -s配合使用。
-d:   删除source-char-list中所定义的字符。
-s:   浓缩重复的字符。如果标准输入中连续重复出现source-char-list里所列的字符,则将其浓缩成一个。或者将其浓缩成replace-char-list中的字符。
tr 'X' 'x' 把所有大写X转换成小写x
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] 数字串。

/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也受特定字符的影响。因此如果要匹配这些字符,需使用反斜线屏蔽其特殊含义。例如,用\ {指定花括号左边可以屏蔽其特殊含义。


代码:

速记符含义八进制方式

\ 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编辑器中,偶尔按住一个键不放。

代码:
And the cowwwwws went homeeeeeeeeeeeee
Or did theyyyyyyyyyyyyy



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



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



plane.txt
9879932 Spitfire




190992 Lancaster




238991 Typhoon



dtdlut@dtdlut:~$ tr -s "\n" < plane.txt
plane.txt
9879932 Spitfire
190992 Lancaster
238991 Typhoon


大写到小写
除了删除控制字符,转换大小写是t r最常用的功能。为此需指定即将转换的小写字符[ a - z ]和转换结果[ A - Z ]。
第一个例子,t r从一个包含大小写字母的字符串中接受输入。

tr "[a-z]" "[A-Z]"      或者          tr "[:lower:]" "[:upper:]"
dtdlut@dtdlut:~$ echo "May Day,May Day,Going Down.." | tr "[a-z]" "[A-Z]"
MAY DAY,MAY DAY,GOING DOWN..


删除指定字符
偶尔会从下载文件中删除只包含字母或数字的列。需要结合使用- c和- s选项完成此功能。
下 面的文件包含一个星期的日程表。任务是从其中删除所有数字,只保留日期。日期有大写,也有小写格式。因此需指定两个字符范围[ a - z ]和[ A - Z ],命令tr    -cs         "[a-z][A-Z]"          "\n"将文件每行所有不包含在[ a - z ]或[ A - Z ](所有希腊字母)的字符串放在字符串replace-char-list中并转换为一新行。- s选项表明压缩所有新行, - c表明取source-char-list的反义。
dtdlut@dtdlut:~$ cat diray.txt
mondy 1all0:5b0
Tuesday 15:00
wednesday 15:30
thurday 10:30
Fridya 09:20


dtdlut@dtdlut:~$ tr -cs "[a-z][A-Z]" "\n" < diray.txt
mondy
all
b
Tuesday
wednesday
thurday
Fridya
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell tr 命令 的相关文章

  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • 如何复制每个扩展名为 X 的文件,同时保留原始文件夹结构? (类Unix系统)

    我正在尝试将每个 HTML 文件从 src 文件夹复制到 dist 文件夹 但是 我想保留原始文件夹结构 如果 dist 文件夹不存在 我想创建一个新文件夹 如果文件夹不存在则创建 d dist mkdir dist 复制每个文件 cp R
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 如何替换“docker run”命令中的变量值

    我正在使用 bash 脚本并尝试分配指纹值 如下所示 export FINGERPRINT D0 19 C5 80 42 66 56 AC 6F docker run rm i v var run docker sock var run d
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • 在 bash 中使用单个命令为 shell 变量分配默认值

    我对 bash 3 00 shell 脚本中的变量进行了大量测试 如果未设置变量 则它会分配默认值 例如 if z VARIABLE then FOO default else FOO VARIABLE fi 我似乎记得有一些语法可以在一行
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • 如何从我自己的脚本向 Fish shell 提供制表符补全?

    我运行的是 Ubuntu 13 10 和 Fish 2 1 0 我想自己编写一个 Python 脚本来从命令行执行一些任务 该脚本将需要命令行参数 我怎样才能编写我的脚本 以便 Fish 可以请求并获取给定参数的可能值 潜在值列表是动态的
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • sh / Bash shell 脚本中 !# (bang-pound) 的含义是什么?

    我想了解这个 Scala 脚本是如何工作的 usr bin env bash exec scala 0 object HelloWorld def main args Array String println Hello world arg
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢

随机推荐

  • 支付宝小程序框架分析

    支付宝小程序框架逆向分析 本文对支付宝小程序的正向开发做了简单介绍 并从正向开发的文件类型入手 对小程序的宿主框架进行了逆向分析 包括运行机制 通信模型以及安全防护体系等内容 代码开发 支付宝小程序开发在语法方面与传统的前端网页开发非常类似
  • Python——发送邮件

    一 smtplib模块 主要通过SMTP类与邮件系统进行交互 使用方法如下 1 实例化一个SMTP对象 s smtplib SMTP 邮件服务地址 端口号 s smtplib SMTP SSL 邮件服务地址 端口号 2 登陆邮件 权限验证
  • Linux:全志H3图像codec使用笔记

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 图像 codec 概述 图像编解码器 codec 包含 Encoder 和 Decoder 两部分功能 我们用下列分别说明 Encoder 和 De
  • 解决window平台下cocos creator 构建发布面板打开后无法显示问题

    项目场景 creator构建发布界面 问题描述 window平台下cocos creator 构建发布面板打开后无法显示 原因分析 项目的配置文件目录setting和local目录内容混乱可能会导致该问题 这时候后重装creator也是没用
  • 设计模式全解析(一)——带你搞懂设计模式

    各位朋友 一提到 设计模式 四个字 是不是有一种若隐若现的朦胧感 我知道设计模式 我知道单例 工厂 观察者 策略 但是设计模式到底是什么呢 解决了什么问题呢 接下来我会一步一步解析一下设计模式 以及各个不同的设计模式到底要做的是什么 我们先
  • Octave的一些基本操作和语法,快速上手Octave,用实例解释

    基本语法 1 直接计算 gt gt 1 2 ans 3 2 变量计算 在最后加上分号 可以不输出结果 gt gt a 1 gt gt b 2 gt gt a b ans 3 3 矩阵赋值 gt gt a 1 2 3 4 5 6 a 1 2
  • Java实现五子棋小游戏(附源码)

    一 效果展示 二 游戏介绍 五子棋 是一种两人对弈的纯策略型棋类游戏 棋具与围棋通用 是起源于中国古代的传统黑白棋种之一 发展于日本 流行于欧美 容易上手 老少皆宜 而且趣味横生 引人入胜 不仅能增强思维能力 提高智力 而且富含哲理 有助于
  • [ Linux ] 静态代码检测工具 —— Cppcheck工具

    文章目录 cppcheck工具介绍 Linux安装 linux使用示例 在makefile中添加cppcheck工具实例 cppcheck工具介绍 什么是静态代码检查 静态代码检查是指在不运行程序的条件下 进行程序分析的方法 有些程序分析需
  • Git 分支管理策略汇总

    原文链接 Git 分支管理策略 最近 团队新入职了一些小伙伴 在开发过程中 他们问我 Git 分支是如何管理的 以及应该怎么提交代码 我大概说了一些规则 但仔细想来 好像也并没有形成一个清晰规范的流程 所以查了一些资料 总结出下面这篇文章
  • 企业如何制定实施MES管理系统的预算方案

    随着制造业的不断发展 MES生产管理系统逐渐成为制造企业提高生产效率 优化资源利用和提升质量水平的重要工具 制定实施MES管理系统的预算方案是企业在进行MES选型和实施时必须考虑的问题 本文将介绍制定实施MES管理系统预算方案的关键步骤 包
  • Nginx常用功能(配置静态资源)

    Nginx配置静态资源 背景 现场业务系统域名均由nginx转发 需求 通过nginx设置静态访问页面 操作如下 1 将静态文件存放在 opt nginx html 下 2 修改nginx conf文件 引用此静态文件 server lis
  • python爬虫爬取使用Ajax请求的网站数据解析——以梅老板微博为例(m.weibo.cn)

    文章目录 前言 什么是Ajax Ajax基本原理 发送请求 解析内容 渲染网页 Ajax分析方法 查看请求 过滤请求 Ajax结果提取 1 分析请求 since id解析 2 分析响应 3 爬取微博数据 后记 前言 前面学习了使用正则表达式
  • 客户服务器显示例子,WebSocket实现数据库更新前台实时显示(示例代码)

    通过一个小实例来实现数据库更新后 推送消息给前台 让前台进行相应操作 需求 数据库更新之后服务器推送消息给前台 让前台做操作 数据库的数据不是由服务器写入的 实现的话说到底都是用轮询 因为数据库的数据不是通过后台插入更新的 所以无论用什么办
  • [解决方法]PermissionError: [Errno 13] Permission denied:

    写Python工程代码 花了我5个小时排错 最后发现是写入文件的时候 权限不够 我做个测试 向C盘根目录写入文件 a C 日志 test txt with open a w encoding utf 8 as file object fil
  • VScode+Keil搭建STM32开发环境

    一 下载MinGW VScode 这是一款编译器 Visual Studio Code中不自带编译器 在没有安装visual studio的前提下 如果没有的话会报错 链接 https pan baidu com s 1oOT9wzFcSS
  • 根据经纬度计算距离的公式

    private const double EARTH RADIUS 6378 137 private static double rad double d return d Math PI 180 0 public static doubl
  • 百度AI平台人脸动漫化python测试

    文章目录 获取百度API 获取token 使用 获取百度API 百度转换风格网址 获取API Key AK 和Secret Key SK 获取token import requests import base64 client id 为官网
  • ACE日志系统

    ACE中日志系统 一 简介 以前曾介绍过一个开源日志系统log4cplus ACE也有自己的Logging Facility 与log4cplus相似 ACE日志系统也具有线程安全 灵活 分级显示等特点 可以面向程序调试 运行 测试 和维护
  • 图解 HTTP 常见问题

    一 HTTP 基本概念HTTP 是什么 描述一下HTTP 是超文本传输协议 也就是HyperText Transfer Protocol 能否详细解释 超文本传输协议 HTTP的名字 超文本协议传输 它可以拆成三个部分 超文本 传输 协议
  • shell tr 命令

    tr是translate的简写 亦即翻译 但是遗憾的是 它不能翻译句子 只能翻译单个字符 1 tr的工作原理是什么 先记住一点 tr命令不接受指定的文件参数 而只是对标准输入进行翻译 tr的命令格式是tr SET1 SET2 凡是在SET1