tr是Linux和Unix系统中的命令行程序,可转换,删除和压缩标准输入的字符,并将结果写入标准输出。
tr
命令通常通过管道与其他命令组合使用,并且可以执行删除重复字符,将大写转换为小写以及基本字符替换和删除的操作。
在本教程中,我们将通过实际示例和最常见选项的详细说明向您展示如何使用tr
命令。
tr 命令选项
tr
命令的语法形式是tr OPTION... SET1 [SET2]
。OPTION
选项是必须的参数,SET
是字符集合,可以是一个多个字符集合。
tr
命令默认接受具有相同长度的两组字符,并用第二组中字符集合替换第一组存在的字符集合。
例如命令echo 'myfreax' | tr 'myf' 'red'
将m
替换为r
,y
替换为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'
删除字符串myfreax
的ea
字符串。
在不压缩字符的情况下删除字符时,您只能指定一组。
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-Z
与a-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
只能使用单个字符。对于复杂的模式匹配和字符串处理应该使用sed
或awk。