Contents

Linux中TR命令简介

1. 概述

在 Linux 中,我们可以使用许多用于文本操作的命令行实用程序。在本教程中,我们将讨论tr命令。

2. tr命令介绍

tr 是“翻译”的缩写。它是GNU coreutils 包的成员。因此,它适用于所有 Linux 发行版。

** tr命令从标准输入 ( stdin )读取字节流, 翻译或删除字符,然后将结果写入标准输出 ( stdout )。**

tr的使用语法 非常简单:

tr [OPTION] SET1 [SET2]

如果我们不向tr传递任何选项,它会将SET1中的每个字符替换为SET2中相同位置的每个字符。

由于tr不支持直接读取文件,如果我们想将其应用于文本文件,我们需要将文件内容通过管道传输到tr或将文件重定向到stdin

我们可以使用tr来执行文本转换,例如:

  • 字符大小写转换
  • 挤压重复字符
  • 删除特定字符
  • 基本文本替换

让我们通过一些示例来学习如何使用tr操作文本。

3. 小写转大写

我们将从一个基本问题开始:将文件中的所有小写字符转换为大写。

让我们看看如何使用tr命令解决这个问题:

$ cat blogdemo.url
www.blogdemo.com
$ tr 'a-z' 'A-Z' < blogdemo.url
WWW.BLOGDEMO.COM

在上面的示例中,我们将文件blogdemo.url重定向到stdin并要求tr进行大小写转换我们在SET1SET2中都使用了字符范围来进行大小写转换。

或者,我们也可以使用几个内置的字符集别名来解决这个问题:

$ tr '[:lower:]' '[:upper:]' < blogdemo.url
WWW.BLOGDEMO.COM

因为tr只会将结果写入 stdout,所以在执行之后,我们的 blogdemo.url文件并没有改变。如果我们希望将翻译后的结果写回输入文件,我们可以将stdout重定向到一个临时文件,然后重命名并覆盖输入文件:

$ tr 'a-z' 'A-Z' < blogdemo.url >tmp.txt && mv tmp.txt blogdemo.url
$ cat blogdemo.url
WWW.BLOGDEMO.COM

4. 基本查找和替换

tr实用程序对于一些简单的“查找和替换”操作很方便,其中一个字符应该被另一个字符替换。例如,让我们用下划线替换文件中的所有连字符:

$ cat env.txt
$JAVA-HOME and $MAVEN-HOME are system variables.
$ cat env.txt | tr '-' '_'
$JAVA_HOME and $MAVEN_HOME are system variables.

我们没有使用重定向,而是使用cat命令将文件env.txt的内容通过管道传输到tr

除了查找和替换单个字符之外,tr还可以进行多个字符替换。让我们看另一个将大括号翻译成括号的例子:

$ echo "{blogdemo}" | tr '{}' '()'
(blogdemo)

我们还可以使用tr进行字符范围转换。现在让我们看一个使用tr加密和解密秘密消息(“这是一条秘密消息”) 的示例:

在这个例子中,我们将使用简单的凯撒密码 作为我们的加密算法:将输入文本中的每个字母替换为字母表中一些固定位置的字母——例如,将“ a ”更改为“ e ”,将“ b ”更改为“ f ”,以此类推:

$ echo "this is a secret message" | tr 'a-z' 'e-zabcd' > secret.txt
$ cat secret.txt
xlmw mw e wigvix qiwweki

为了解密秘密文件,我们在上面的 tr命令中交换SET1SET2

$ tr 'e-zabcd' 'a-z' < secret.txt
this is a secret message

5. 截断搜索模式

如果我们回顾上一节中的示例,我们会注意到我们传递给trSET1和 SET2始终具有相同的长度。

如果SET2SET1短,让我们看看tr会给我们 什么:

$ echo "abcdefg" | tr 'abcdefg' 'ABC'
ABCCCCC

**当SET2短于SET1时,tr命令将默认重复SET2的最后一个字符。**因此,我们在上面的输出中看到,  SET2中的最后一个字母“ C ”被重复以匹配从“ d ”到“ g ”的字母。所以命令变成tr ‘abcdefg’ ‘ABCCCCC’

我们可以使用 truncate 选项“ -t ”来改变这个默认行为,让 tr限制匹配到SET2的长度:

$ echo "abcdefg" | tr -t 'abcdefg' 'ABC' 
ABCdefg

6.挤压重复字符

我们可以使用带有挤压选项“ -s ”的tr删除重复的字符实例。

让我们看一个将多个连续空格转换为单个空格的示例:

$ echo 'Hi,   nice   to  meet            you!' | tr -s ' ' 
Hi, nice to meet you!

如果我们将 -s选项连同 SET1SET2一起传递给tr,它将首先进行翻译, 然后在SET2中压缩重复的字符。例如:

$ echo 'TODAYYYY IIIS SOOO COOOLD ~' | tr -s 'A-Z' 'a-z'  
today is so cold ~

7.删除特定字符

我们可以将“ -d ”选项传递给tr以删除SET1中的字符。

与“ -s ”选项不同,当我们将“ -d ”连同SET1SET2一起传递给tr 时,* SET2*将被忽略并且不会进行任何转换。

例如,我们想从输入文本中删除所有小写字母:

$ echo "A a B b C c" | tr -d 'a-z'
A  B  C

8. 寻找SET1的补码

我们可以将选项“ -c ”传递给tr,使其搜索SET1 的补集。搜索 SET1 的补码意味着搜索 SET1 的

有时这个选项可以简化SET1的定义。

例如,我们想匹配任何不是小写字母的字符并将其转换为空格:

$ echo "tr@is#aMvery~handy tool" | tr -c 'a-z' ' '
tr is a very handy tool

我们还可以将“ -c ”选项与“ -d ”或“-s”结合使用。下一个示例展示了我们如何从customer.csv文件中提取 id 号:

$ cat customer.csv
Name,Country,Id
James,USA,1234567890
John,Canada,0987654321
$ cat customer.csv | tr -cd '0-9\n'
1234567890
0987654321

在上面的示例中,我们必须在SET1中包含换行符 ( \n ) 。否则,输入文件中的所有换行符也将被删除,并且我们会将所有 id 编号连接到一行中。这不是我们想要的。