命令:tr
程序员文章站
2023-01-29 14:09:36
参考资料:https://www.thegeekstuff.com/2012/12/linux tr command/ 简介 tr命令用于转换、删除或者去除重复字符。它从STDIN中读取数据并且将其写入SDTOUT。 因此它的用法是这样的。从用户键入的STDIN中读取。 或者这样的。通过输入重定向来 ......
参考资料:https://www.thegeekstuff.com/2012/12/linux-tr-command/
简介
tr命令用于转换、删除或者去除重复字符。它从stdin中读取数据并且将其写入sdtout。
因此它的用法是这样的。从用户键入的stdin中读取。
[root@c7 ~]# tr abc abc abcdefg abcdefg aabbcc aabbcc def def
或者这样的。通过输入重定向来读取文件的数据。
[root@c7 ~]# cat tr.txt abcdefg aabbcc def [root@c7 ~]# tr abc abc < tr.txt abcdefg aabbcc def
因为是写入到stdout,因此不会修改作为stdin的文件的内容。
它不支持直接将文件作为命令的参数传入。
[root@c7 ~]# tr abc abc tr.txt tr: extra operand ‘tr.txt’ try 'tr --help' for more information.
语法格式
tr [option]... set1 [set2]
转换
如果set1和set2都指定了并且没有-d选项。那么tr就会将set1中的每个字符按照位置一一替换为set2中对应的每个字符。
1. 大小写转换
[root@c7 ~]# tr abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz zhangwenlong zhangwenlong [root@c7 ~]# tr [:lower:] [:upper:] zhangwenlong zhangwenlong [root@c7 ~]# tr a-z a-z zhangwenlong zhangwenlong
2. 括号转换
括号这类符号也可以进行转换,不过要注意的是需要使用引号包裹。
[root@c7 ~]# cat tr.txt {zhang} {wen} {long} [root@c7 ~]# tr {} () < tr.txt -bash: syntax error near unexpected token `(' [root@c7 ~]# tr '{}' '()' < tr.txt (zhang) (wen) (long) [root@c7 ~]# tr "{}" "()" < tr.txt (zhang) (wen) (long)
默认情况下,是将转换后的结果写到stdout,可以通过输出重定向至文件。
注意:这不会改变原文件。
[root@c7 ~]# cat tr.txt {zhang} {wen} {long} [root@c7 ~]# tr '{}' '()' < tr.txt > tr_new.txt [root@c7 ~]# cat tr.txt {zhang} {wen} {long} [root@c7 ~]# cat tr_new.txt (zhang) (wen) (long)
如果stdin和stdout的文件是同一个的话,也无法达到像我们预期的那样修改文件的效果。
反而会清空文件!!!
[root@c7 ~]# cat tr.txt {zhang} {wen} {long} [root@c7 ~]# tr '{}' '()' < tr.txt > tr.txt [root@c7 ~]# cat tr.txt [root@c7 ~]# wc -l tr.txt 0 tr.txt
3. 空格转换制表符
注意,不仅仅是空格被转换,末尾的换行符也被转换了。
[root@c7 ~]# echo "this is for testing" | tr [:space:] '\t' this is for testing [root@c7 ~]#
通过这个例子比较直观可以显示了。
[root@c7 ~]# echo "this is for testing" | tr [:space:] 'l' thislislforltestingl[root@c7 ~]#
4. 使用-s选项来压缩重复的字符
案例3中,如果空格的数量大于一个,那么我们在转换的时候,就会针对每一个连续且重复的空格都进行转换为制表符的操作,如下所示。
[root@c7 ~]# echo "this is for testing" | tr [:space:] '\t' this is for testing [root@c7 ~]# [root@c7 ~]# echo "this is for testing" | tr [:space:] '\t' this is for testing [root@c7 ~]#
通过-s选项,就会将连续且重复的字符,仅识别为单个字符,然后进行转换。
[root@c7 ~]# echo "this is for testing" | tr [:space:] '\t' this is for testing [root@c7 ~]# [root@c7 ~]# echo "this is for testing" | tr -s [:space:] '\t' this is for testing [root@c7 ~]#
同样的,可以将多个连续的空格转换为单个空格字符。
[root@c7 ~]# echo "this is for testing" | tr -s [:space:] ' ' this is for testing
5. 使用-d选项删除特定的字符
因为是删除,所以在语法格式中,只需要set1,不需要set2。
[root@c7 ~]# echo "the geek stuff" | tr -d t he geek suff [root@c7 ~]# echo "my number is 89757" | tr -d [:digit:] my number is
如果想要删除文件中符合条件的行的话,那么需要使用。
6. 使用-c选项来获取集合的补集
因为是数字的补集,所以末尾的换行符也被删除了。
[root@c7 ~]# echo "my number is 89757" | tr -cd [:digit:] 89757[root@c7 ~]#
7. 删除不可打印字符
第五行是三个空格,第六行是三个制表符。从结果来看,不可打印的字符应该是换行符和制表符。
[root@c7 ~]# cat tr.txt zhangwenlong zhangwenlong 123456 !@#$%^ [root@c7 ~]# tr -dc [:print:] < tr.txt zhangwenlongzhangwenlong123456!@#$%^ [root@c7 ~]#
8.将文件中的所有行合并为一行
[root@c7 ~]# cat tr.txt zhangwenlong zhangwenlong 123456 !@#$%^ [root@c7 ~]# tr -s '\n' ' ' < tr.txt zhangwenlong zhangwenlong 123456 !@#$%^ [root@c7 ~]#
下一篇: 左连接,右连接