tr是Linux和Unix系统中的命令行程序,可转换,删除和压缩标准输入的字符,并将结果写入标准输出

tr命令通常通过管道与其他命令组合使用,并且可以执行删除重复字符,将大写转换为小写以及基本字符替换和删除的操作。

在本教程中,我们将通过实际示例和最常见选项的详细说明向您展示如何使用tr命令。

tr 命令选项

tr命令的语法形式是tr OPTION... SET1 [SET2]OPTION选项是必须的参数,SET是字符集合,可以是一个多个字符集合。

tr命令默认接受具有相同长度的两组字符,并用第二组中字符集合替换第一组存在的字符集合。

例如命令echo 'myfreax' | tr 'myf' 'red'm替换为ry替换为e,将f替换为d

echo 'myfreax' | tr 'myf' 'red'
redreax

也可以使用字符范围来定义字符集,减少繁琐的输入,例如你要输入lmno,可以使用l-n代替。

也就是说命令echo 'myfreax' | tr 'lmno' 'wxyz'echo 'myfreax' | tr 'l-n' 'w-z'是等价的。

echo 'myfreax' | tr 'lmno' 'wxyz'
echo 'myfreax' | tr 'l-n' 'w-z'

当使用tr命令的-c/--complement选项时,tr命令将会替换第一组不存在的所有字符。

例如命令echo 'myfreax' | tr -c 'fa' 'xy'使用y替换字符串myfreax不是f或者a的字符。

您可能已经注意到输出比输入多一个可见的字符。这是因为echo命令会打印一个不可见的换行符\n

tr命令也将\n字符也替换为y。为了使echo命令不打印换行符,请使用echo命令的-n选项。

echo 'myfreax' | tr -c 'fa' 'xy'
echo -n 'myfreax' | tr -c  'fa' 'xy'
yyfyyayy

tr命令的-d/--delete选项删除指定字符集合。例如命令echo 'myfreax' | tr -d 'ea'删除字符串myfreaxea字符串。

在不压缩字符的情况下删除字符时,您只能指定一组。

echo 'myfreax' | tr -d 'ea'
myfrx

-s/--squeeze-repeats选项使用最后一个字符集合替换重复出现的字符。命令echo "GNU     \    Linux" | tr -s ' '删除重复出现的空格字符。

在指定第二个字符集合时,首先使用第一个字符集合替换字符串GNU     \    Linux,然后使用第二个字符集合替换第一个字符集合。

echo "GNU     \    Linux" | tr -s ' ' #GNU \ Linux
echo "GNU     \    Linux" | tr -s ' ' '_' #GNU_\_Linux

tr 命令转换小写大写

将小写转换为大写或者大写转小写。是tr命令的典型用例之一。在指定字符集合时可以使用[:lower:]匹配小写字符,[:upper:]匹配大写字符。

除了字符类,您还可以使用范围,例如'a-z'匹配小写字符串,'A-Z'匹配大写字符。要将大写转换为小写,只需切换字符集合的位置即可。

命令echo 'myfreax' | tr 'a-z' 'A-Z'转换为大写,echo 'myfreax' | tr 'A-Z' 'a-z'转换为小写。

echo 'myfreax' | tr '[:lower:]' '[:upper:]' #MYFREAX
echo 'myfreax' | tr 'a-z' 'A-Z' #MYFREAX

tr 命令删除数字

[:digit:]代表所有数字字符,要删除数字,可以组合使用tr命令的-cd选项删除所有非数字字符。

tr命令的-c选项表示替换第一组不存在的所有字符。-s选项表示删除字符一组字符集合存在的字符。

tr -cd [:digit:]组合起来就是删除第一组字符集合不是数字的字符,如果你要删除不是数字的字符,使用[:alpha:]替换[:digit:]

echo "my phone is 123-456-7890" | tr -cd [:digit:]
1234567890

tr 命令在单词末尾插入换行符

[:alnum:]代表所有数字和字符A-Za-z,要在单词末尾插入换行符,可以组合使用tr命令的-cs选项删除所有非数字字符。

tr命令的-c选项表示替换第一组不存在的所有字符。-s选项表示使用最后一个字符集合替换重复出现的字符。-c '[:alnum:]'表示搜索所有空白字符。

tr -cs '[:alnum:]' '\n'组合起来就是搜索所有空白字符串替换为换行符\n

echo 'GNU is an operating system' | tr -cs '[:alnum:]' '\n'
GNU
is
an
operating
system

tr 命令删除空行

由于tr命令仅接受标准输入,因此必须使用标准输入重定向符号<,将标准输入的键盘替换为文件。

tr命令的-s选项表示使用最后一个字符集合替换重复出现的字符。换行符号在单行中会被以为是重复字符串。

tr -s '\n'组合就是替换重复的换行符,由于命令没有指定第二个字符集合,因此没有字符替换。

最后> new_file.txt就是将tr命令的标准输出重定向到文件new_file.txt

tr -s '\n' < file.txt > new_file.txt

tr 命令打印$PATH目录

$PATH环境变量是用冒号分隔的目录列表,指示Shell程序在用户运行命令时要搜索可执行文件的目录。

如要在每一行打印每个$PATH环境变量的目录,只需要将冒号:替换为换行符号即可。

echo $PATH | tr  ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

结论

现在,您应该对如何使用Linux tr命令有很好的了解。tr只能使用单个字符。对于复杂的模式匹配和字符串处理应该使用sedawk