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进行大小写转换。我们在SET1和SET2中都使用了字符范围来进行大小写转换。
或者,我们也可以使用几个内置的字符集别名来解决这个问题:
$ 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命令中交换SET1和SET2 :
$ tr 'e-zabcd' 'a-z' < secret.txt
this is a secret message
5. 截断搜索模式
如果我们回顾上一节中的示例,我们会注意到我们传递给tr的SET1和 SET2始终具有相同的长度。
如果SET2比SET1短,让我们看看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选项连同 SET1和SET2一起传递给tr,它将首先进行翻译, 然后在SET2中压缩重复的字符。例如:
$ echo 'TODAYYYY IIIS SOOO COOOLD ~' | tr -s 'A-Z' 'a-z'
today is so cold ~
7.删除特定字符
我们可以将“ -d ”选项传递给tr以删除SET1中的字符。
与“ -s ”选项不同,当我们将“ -d ”连同SET1和SET2一起传递给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 编号连接到一行中。这不是我们想要的。