介绍
在本实验中,我们将探索 Linux 中的 tr 命令,这是一个用于在字符级别转换文本的多功能工具。tr 命令是「translate」(转换)的缩写,广泛用于转换大小写、删除特定字符以及基础数据清洗等任务。通过本实验,你将能够熟练地在各种文本处理场景中使用 tr。本实验专为初学者设计,所以如果你是 Linux 命令的新手也不必担心——我们会仔细引导你完成每一个步骤。
理解 tr 的基础知识
让我们先从了解 tr 命令的基本语法开始:
tr [OPTION]... SET1 [SET2]
tr 命令从标准输入(stdin)读取文本,根据指定的选项和字符集进行转换,并将结果写入标准输出(stdout)。
让我们从一个简单的例子开始。我们将创建一个名为 greeting.txt 的文件,其中包含一条基本的问候消息,然后使用 tr 将所有小写字母转换为大写字母。
首先,创建文件:
echo "hello, world" > ~/project/greeting.txt
提示:你可以将文件创建命令复制并粘贴到终端中,以确保正确创建文件。
此命令在你的项目目录(~/project/)中创建了一个名为 greeting.txt 的新文件,内容为「hello, world」。
现在,让我们使用 tr 将所有小写字母转换为大写:
cat ~/project/greeting.txt | tr 'a-z' 'A-Z'
你应该会看到以下输出:
HELLO, WORLD
让我们分解一下这个命令:
cat ~/project/greeting.txt:读取文件内容。|:这是管道符号。它将左侧命令的输出作为输入传递给右侧的命令。tr 'a-z' 'A-Z':这是我们的tr命令。它将第一个集合('a-z',代表所有小写字母)中的每个字符转换为第二个集合('A-Z',代表所有大写字母)中对应的字符。
请注意,此命令不会修改原始文件。如果你想保存转换后的文本,需要将输出重定向到一个新文件。
使用 tr 删除字符
tr 命令还可以从输入中删除特定字符。当你需要通过移除不需要的字符来清理文本时,这非常有用。让我们创建一个带有标点符号的文件,然后将其移除。
首先,创建一个带有标点符号的文件:
echo "Hello, World! How are you?" > ~/project/punctuated.txt
提示:你可以将文件创建命令复制并粘贴到终端中,以确保正确创建文件。
现在,让我们使用 tr 移除所有标点符号:
cat ~/project/punctuated.txt | tr -d '[:punct:]'
你应该会看到:
Hello World How are you
让我们分解一下这个命令:
cat ~/project/punctuated.txt:读取文件内容。|:通过管道将输出传递给tr命令。tr -d '[:punct:]':-d选项告诉tr删除指定的字符。[:punct:]是一个字符类,代表所有标点符号。字符类是预定义的字符集合,可以更方便地指定一组字符。
此命令从文本中删除了所有标点符号,只留下字母、数字和空格。
转换多个字符
现在让我们探索一种更复杂的转换。我们将创建一个包含加密文本的文件,并使用 tr 对其进行解密。这个例子展示了 tr 如何用于简单的加密和解密。
首先,创建一个包含加密文本的文件:
echo "Tijt jt b tfdsfu nfttbhf." > ~/project/encoded.txt
提示:你可以将文件创建命令复制并粘贴到终端中,以确保正确创建文件。
现在,让我们对其进行解密:
cat ~/project/encoded.txt | tr 'b-za-a' 'a-z'
你应该会看到:
This is a secret message.
让我们分解一下这个命令:
cat ~/project/encoded.txt:读取加密文件的内容。|:通过管道将输出传递给tr命令。tr 'b-za-a' 'a-z':- 第一个集合 'b-za-a' 包含:
- 'b-z':字母 b 到 z
- 'a-a':字母 a
- 所以完整的第一个集合是:b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a
- 第二个集合 'a-z' 是:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
- 这创建了一个映射,第一个集合中的每个字母都被第二个集合中对应的字母替换:
- b(第一个集合中的第 1 个)→ a(第二个集合中的第 1 个)
- c(第一个集合中的第 2 个)→ b(第二个集合中的第 2 个)
- ...
- a(第一个集合中的第 26 个)→ z(第二个集合中的第 26 个)
- 这实际上将输入中的每个字母在字母表中向后移动了一位(凯撒密码解密)。
- 注意:
tr命令执行的是逐字符转换,因此只有小写字母受到影响。消息开头的「T」等大写字母保持不变,因为它们不匹配第一个集合中的任何字符。
- 第一个集合 'b-za-a' 包含:
这种类型的替换是一种非常简单的加密形式,称为凯撒密码。虽然它在现实世界中并不安全,但它是展示 tr 如何进行逐字符替换的绝佳示例。
在 tr 中使用字符类
tr 命令支持各种字符类,即预定义的字符集合。这些对于更复杂的文本转换非常有用。让我们在实际场景中使用其中一些。
首先,创建一个包含混合内容的文件:
echo "User123 logged in at 09:45 AM on 2023-08-15" > ~/project/log_entry.txt
提示:你可以将文件创建命令复制并粘贴到终端中,以确保正确创建文件。
现在,让我们从这个日志条目中仅提取数字:
cat ~/project/log_entry.txt | tr -cd '[:digit:]'
你应该会看到:
12309452023815
让我们分解一下这个命令:
cat ~/project/log_entry.txt:读取日志文件的内容。|:通过管道将输出传递给tr命令。tr -cd '[:digit:]':-c选项表示取反(即「不在该集合中」)。-d选项表示删除指定的字符。[:digit:]是一个代表所有数字(0-9)的字符类。- 组合起来,
-cd '[:digit:]'意味着「删除所有不是数字的字符」。
此命令对于从混合文本中提取数值数据非常有用,在日志分析或数据清洗任务中很有帮助。
使用 tr 压缩重复字符
tr 命令还可以将重复的字符「压缩」(squeeze)为单个字符。这对于清理包含不必要重复数据的文本非常有用。让我们创建一个带有重复字符的文件,然后对其进行清理。
首先,创建一个带有重复空格的文件:
echo "This is a test with extra spaces." > ~/project/spaced.txt
提示:你可以将文件创建命令复制并粘贴到终端中,以确保正确创建文件。
现在,让我们使用 tr 压缩重复的空格:
cat ~/project/spaced.txt | tr -s ' '
你应该会看到:
This is a test with extra spaces.
让我们分解一下这个命令:
cat ~/project/spaced.txt:读取带有额外空格的文件内容。|:通过管道将输出传递给tr命令。tr -s ' ':-s选项将指定字符的连续重复压缩为单个。' '指定我们要压缩空格字符。
当处理格式不良的数据或需要规范化文本文件中的空白字符时,此命令特别有用。
总结
在本实验中,我们探索了 Linux 中功能强大的 tr 命令。我们学习了如何:
- 转换文本大小写
- 删除特定字符
- 转换多个字符
- 使用字符类
- 压缩重复字符
tr 命令是文本操作的利器。以下是一些我们没有详细涉及的其他选项:
-c:对第一个字符串中的字符集取反,即对所有不在第一个字符串中的字符进行操作。-t:将第一个字符串截断为与第二个字符串相同的长度。
对于更高级的文本处理任务,你可以在未来的实验中探索 sed 和 awk 等其他命令。



