如何使用 Linux tr 命令
已发表: 2023-05-17您是否需要一种简洁的方法来在 Linux 中操作文本流? 只需看看 tr 命令,它可以节省您替换、删除、合并和压缩输入文本的时间。 这就是它的完成方式。
什么是 tr 命令?
替换字符
使用范围和标记
反转火柴
删除和压缩字符
删除字符
合并和分割线
将 tr 与管道一起使用
简单就是简单
什么是 tr 命令?
Linux tr
命令是一个快速而简单的实用程序,用于从文本流中去除不需要的字符,以及其他简洁的操作技巧。 它的名字来源于“翻译”一词,而tr
的根源深深植根于 Unix 传统。
众所周知,Linux 是 Unix 的开源重写。 它也将自己的东西添加到组合中。 它不是一个字节对字节的克隆,但它显然从 Unix 操作系统中汲取了大部分设计原则和工程指导。
尽管迄今为止只有两个 Linux 发行版(EulerOS 和 Inspur K-UX)被认证为 POSIX 兼容并被正式接受为 Unix 的实现——EulerOS 和 Inspur K-UX——Linux 在商业世界中几乎完全取代了 Unix。
所有 Linux 发行版,至少在它们的核心实用程序中,都遵循 Unix 哲学。 Unix 哲学概括了 Unix 先驱们对其新操作系统的愿景。 它通常被解释为“编写能做好一件事的程序”。 但不仅如此。
最强大的创新之一是程序应该生成可用作其他程序输入的输出。 将命令行实用程序菊花链在一起的能力非常强大,使用一个程序的输出流作为输入流到下一个程序。
有时您会希望在一个程序的输出到达下一个程序之前对其进行微调或微调。 或者,也许您没有从 Linux 命令行工具获取输入,而是从一个文件中流式传输文本,而这个文件并不是根据您的特定需求创建的。
这就是tr
发挥作用的地方。 它允许您对其输入流执行一组简单的转换,以生成其输出流。 该输出流可以重定向到一个文件中,输入到另一个 Linux 程序中,甚至输入到tr
的另一个实例中,以便对流应用多个转换。
替换字符
tr
命令根据规则对其输入流进行操作。 在没有任何命令行选项的情况下使用, tr
的默认操作是用输入流中的字符替换其他字符。
tr
命令通常需要两组字符。 第一组包含在输入流中找到时将被替换的字符。 第二组包含将被替换的字符。
其工作方式是第一组中出现的第一个字符将被第二组中的第一个字符替换。 第一组中出现的第二个字符将被第二组中的第二个字符替换,依此类推。
此示例将在tr
的输入流中查找字母“c”,并将每个匹配项替换为字母“z”。 请注意, tr
区分大小写。
我们正在使用echo
将一些文本推送到tr
中。
回声 abcdefabc | tr 'c' 'z'
所有出现的“c”都被替换为“z”,新字符串被写入终端窗口。
这次我们将搜索两个字母“a”和“c”。 请注意,我们不是在搜索“ac”。 我们正在寻找“a”,然后寻找“c”。 我们将用“x”替换所有出现的“a”,用“z”替换所有出现的“c”。
回声 abcdefabc | tr '交流' 'xz'
为此,您必须在两组中使用相同数量的字符。 如果不这样做,您将获得可预测但可能不想要的行为。
echo '叫我以实玛利。' | tr 'abcdjklm' '123'
第一组中的字符比第二组中的字符多。 字母“d”到“m”在第二组中没有对应的字符。 他们仍然会被替换,但他们都被第二组中的最后一个角色替换了。
这在某些情况下可能很有用,但如果您想防止这种情况发生,您可以使用-t
(截断)选项。 这只会替换包含在第一组中且在第二组中具有匹配字符的那些字符。
echo '叫我以实玛利。' | tr -t 'abcdjklm' '123'
使用范围和标记
设置一和设置二可以包含字符范围。 例如, [az]
代表所有小写字母, [AZ]
代表所有大写字母。 我们可以利用它来改变文本流的大小写。
这会将输入流转换为大写。
echo “How-To Geek” | tr '[az]' '[AZ]'
要在另一个方向翻转大小写,我们可以使用相同的命令,但在命令行上交换大写和小写范围。
echo “How-To Geek” | tr '[AZ]' '[az]'
对于我们可能想要匹配的一些常见情况,我们可以使用一些标记。
- [:alnum:] :字母和数字。
- [:alpha:] :仅限字母。
- [:digit:] :仅限数字。
- [:blank:] :制表符和空格。
- [:space:] :所有空格,包括换行符。
- [:graph:] :所有字符包括符号,但不包括空格。
- [:print:] :所有字符包括符号,包括空格。
- [:punct:] :所有标点符号。
- [:lower:] :小写字母。
- [:upper:] :大写字母。
我们可以使用标记轻松地执行小写到大写和大写到小写的转换。
echo “How-To Geek” | tr '[:lower:]' '[:upper:]'
echo “How-To Geek” | tr '[:upper:]' '[:lower:]'
反转火柴
-c
(补码)选项匹配除第一组字符之外的所有字符。 此命令将除字母“c”之外的所有内容转换为连字符“ -
”。
回声 abcdefc | tr -c 'c' '-'
此命令将字母“a”添加到第一组。 除“a”或“c”之外的任何内容都将转换为连字符“ -
”字符。
回声 abcdefc | tr -c 'ac' '-'
删除和压缩字符
我们可以使用tr
完全删除字符,而不进行任何替换。
此命令使用-d
(删除)选项从输入流中删除任何出现的“a”、“d”或“f”。
回声 abcdefc | tr -d 'adf'
这是一个例子,我们在命令行上只有一组字符,而不是两组。
另一个是当我们使用-s
(挤压重复)选项时。 此选项将重复字符减少为单个字符。
此示例将空格字符的重复序列减少为单个空格。
echo "abc de fc" | tr -s '[:空白:]'
[:blank:]
标记代表空格字符,而[:space:]
标记代表所有形式的空白,包括制表符和换行符,这有点令人困惑。
在这种情况下,我们可以用[:blank:]
替换[:space:]
并得到相同的结果。
echo "abc de fc" | tr -s '[:空格:]'
删除字符
[:blank:]
和[:space:]
之间的区别在我们删除字符时变得很明显。 为此,我们使用-d
(删除)选项,并提供tr
将在其输入流中查找的一组字符。 它找到的任何内容都将被删除。
echo "abc de fc" | tr -d '[:空白:]'
空格被删除。 请注意,在终端窗口中写入输出流后,我们会得到一个换行符。 如果我们重复该命令并使用[:space:]
而不是空白,我们将得到不同的结果。
echo "abc de fc" | tr -d '[:空白:]'
这一次我们没有在输出后开始新的一行,命令提示符正好对着它。 这是因为[:space:]
包含换行符。 从输入流中删除所有空格、制表符和换行符。
当然,您也可以使用实际的空格字符。
echo "abc de fc" | tr -d ' '
我们可以很容易地删除数字。
回声 abcd123efg | tr -d '[:数字:]'
通过组合-c
(补码)和-d
(删除)选项,我们可以删除除数字以外的所有内容。
回声 abcd123efg | tr -cd '[:数字:]'
请注意,除数字外的所有内容均表示所有字母和所有空格,因此我们再次丢失了终止换行符。
合并和分割线
如果我们用换行符代替空格,我们可以拆分一行文本并将每个单词放在自己的行上。
echo '一二三四' | tr ' ' '\n'
我们也可以更改分隔单词的分隔符。 此命令用冒号“ :
”代替空格。
echo '一二三四' | tr ' ' ':'
我们可以找到正在使用的任何定界符,并将其替换为换行符,将难以阅读的文本拆分为更易于管理的输出。
路径环境变量是一长串很多目录路径。 冒号“ :
”分隔每个路径。 我们会将它们更改为换行符。
回显 $PATH
回声 $PATH | tr ":" "\n"
这在视觉上更容易解析。
如果我们有想要重新格式化为单行的输出,我们也可以这样做。 文件“lines.txt”包含一些文本,每行一个词。 我们会将其输入tr
并将其转换为单行。
猫文件.txt
猫行.txt | tr '\n' ' '
将 tr 与管道一起使用
我们可以使用tr
的输出作为另一个程序的输入,甚至是tr
本身的输入。
此命令使用tr
四次。
- 第一个
tr
从输入中删除任何连字符“-”。 - 第二个
tr
将任何重复的空格压缩成单个空格。 - 第三个
tr
用下划线“_”字符替换空格。 - 第四个也是最后一个
tr
将字符串转换为小写。
echo "损坏的文件-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'
相关:如何在 Linux 上使用管道
简单就是简单
tr
命令很棒,因为它很简单。 没有太多要学习或记住的。 但它的简单性也可能是它的垮台。
别搞错了,您经常会发现tr
让您可以做您需要做的事,而无需使用更复杂的工具,如sed
。
但是,如果您正在努力使用tr
做某事,并且您发现自己在构建长菊花链命令,那么您可能应该使用sed
。