Intro
本节讲一讲字符替换命令tr的用法
tr命令
格式
-
tr [OPTION] chars_to_be_transformed_from [chars_to_be_transformed_to]
-
tr接受标准输入,根据给定的单个字符映射对,将来源文本数据进行字符查找和转换(而非字符串),并原样输出。
-
管道和io重定向<是两个输入tr的方式。tr接受标准输入,而非文件的命令行参数。这一点和cat一样。
-
使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
选项
-
-c 取反:用字符集2的字符逐一替换字符串1中字符集的补集,要求字符集为ASCII;
-
-d 删除:删除字符集1中的字符;
-
-s 去重:删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串;
例程
-
一般用法
-
$ tr 'ieoau' 'IEOAU' < plain.txt #建立i->I;e->E;o->O;a->A;u->U;的映射对,而非替换字符串,那是sed的工作
-
-
-
>sEnd sOmEOnE tO lOvE mE
-
>I nEEd tO rEst In Arms
-
----------------------------------------
-
$ tr '{}' '()' < textfile > newfile #转换花括号到小括号
-
-----------------------------------------
-
$ tr [a-z] [A-Z] < plain.txt #小写转换成大写
-
$ tr 'a-z' 'A-Z' < plain.txt #等效形式
-
-
-
>SEND SOMEONE TO LOVE ME
-
>I NEED TO REST IN ARMS
-
$ tr 'a\-z' 'A\-Z' < plain.txt#只转换a,-,z三个字符。
-
-----------------------------------------
-
删除用法
-
$ tr -d 'soul' < plain.txt#注意,'s','o','u','l'每个字符都会被删除
-
-
-
>end mene t ve me
-
>i need t ret in arm
-
-----------------------------------------
-
$ tr -d '\r' < windows_format_files > unix_format_files #实现dos2unix转换
-
-
-
>/home/work/dataio/data/jnprod2alb/$
-
>/home/work/dataio/data/adrccharge$
-
-----------------------------------------
-
去重用法
-
$ echo xxxxxxxxxyyzzz | tr -s 'x'
-
xyyzzz
-
$ echo xxxxxxxxxyyzzz | tr -s 'xyz'
-
xyz
-
$ echo xxxxxxyyyyyzzzz | tr 'x' 'X'
-
XXXXXXyyyyyzzzz
-
$ echo xxxxxxyyyyyzzzz | tr -s 'x' 'X' #合并去重后再替换
-
$ echo xxxxxxyyyyyzzzz | tr -s 'x' | tr 'x' 'X' #等价形式
-
Xyyyyyzzzz
-
----------------------------------------
-
取补集用法
-
$ echo a1b2c3 | tr -c '0-9' 'X'
-
X1X2X3$ #换行符\n也一并被替换干净
-
$ echo a1b2c3 | tr -c '0-9' '[X*]' #等价形式
技巧
dos2unix的简单实现
-
$ tr -s '\r' '\n' < windows_file > unix_file
-
$ tr -d '\r' < windows_file > unix_file
对一段文章建立单词列表
-
$ tr -cs 'a-zA-Z' '\n' < paragragh > words_list
小写变大写
-
$ tr [a-z] [A-Z] < plain.txt #小写转换成大写
-
$ tr 'a-z' 'A-Z' < plain.txt #等效形式
结论
在需要做字符替换、字符去重等工作时,小巧的tr往往展现出了比sed和awk等"大型"工具更简洁直接的解决能力。
阅读(1435) | 评论(0) | 转发(0) |