Linux tr 命令:字符转换

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将探索 Linux 中的 tr 命令,这是一个用于在字符级别转换文本的多功能工具。tr 命令是 "translate" 的缩写,广泛用于大小写转换、删除特定字符以及基本数据清理等任务。通过本实验,你将熟练掌握在各种文本处理场景中使用 tr 命令。本实验专为初学者设计,因此如果你对 Linux 命令不熟悉,也不必担心——我们将逐步引导你完成每个步骤。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/tr("Character Translating") subgraph Lab Skills linux/echo -.-> lab-219198{{"Linux tr 命令:字符转换"}} linux/cat -.-> lab-219198{{"Linux tr 命令:字符转换"}} linux/tr -.-> lab-219198{{"Linux tr 命令:字符转换"}} end

理解 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

让我们分解这个命令:

  1. cat ~/project/greeting.txt:读取文件的内容。
  2. |:这是一个管道符号。它将左侧命令的输出作为输入传递给右侧的命令。
  3. 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

让我们分解这个命令:

  1. cat ~/project/punctuated.txt:读取文件的内容。
  2. |:将输出通过管道传递给 tr 命令。
  3. 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.

让我们分解这个命令:

  1. cat ~/project/encoded.txt:读取编码文件的内容。
  2. |:将输出通过管道传递给 tr 命令。
  3. tr 'b-za-a' 'a-z'
    • 第一个集合 'b-za-a' 表示一个偏移的字母表,其中 'b' 被视为 'a''c' 被视为 'b',依此类推,'a' 则回绕到 'z'
    • 第二个集合 'a-z' 是正常的字母表。
    • 这实际上将输入中的每个字母在字母表中向后移动一个位置。

这种替换是一种非常简单的加密形式,称为凯撒密码(Caesar cipher)。虽然它在实际使用中并不安全,但它是一个很好的示例,展示了如何使用 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

让我们分解这个命令:

  1. cat ~/project/log_entry.txt:读取日志文件的内容。
  2. |:将输出通过管道传递给 tr 命令。
  3. tr -cd '[:digit:]'
    • -c 选项对集合取补集(即“不在此集合中”)。
    • -d 选项删除指定的字符。
    • [:digit:] 是一个字符类,表示所有数字(0-9)。
    • 结合起来,-cd '[:digit:]' 表示“删除所有非数字字符”。

此命令对于从混合文本中提取数值数据非常有用,这在日志分析或数据清理任务中可能会派上用场。

使用 tr 压缩重复字符

tr 命令还可以将重复的字符“压缩”为单个字符。这对于清理包含不必要重复的数据非常有用。让我们创建一个包含重复字符的文件,然后对其进行清理。

首先,创建一个包含重复空格的文件:

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.

让我们分解这个命令:

  1. cat ~/project/spaced.txt:读取包含多余空格的文件内容。
  2. |:将输出通过管道传递给 tr 命令。
  3. tr -s ' '
    • -s 选项将指定字符的重复出现压缩为单个字符。
    • ' ' 指定我们要压缩空格字符。

此命令在处理格式不良的数据或需要规范化文本文件中的空白时特别有用。

总结

在本实验中,我们探索了 Linux 中功能强大的 tr 命令。我们学习了如何:

  1. 转换文本大小写
  2. 删除特定字符
  3. 翻译多个字符
  4. 使用字符类
  5. 压缩重复字符

tr 命令是一个强大的文本处理工具。以下是一些我们未详细涵盖的附加选项:

  • -c:对字符串 1 中的字符集取补集,即操作所有不在字符串 1 中的字符
  • -t:将字符串 1 截断为字符串 2 的长度

对于更高级的文本处理任务,你可以在未来的实验中探索其他命令,例如 sedawk

资源