Linux tr命令(translate)用于转换或删除字符,是文本处理中非常实用的工具。
提示: tr命令只能处理来自标准输入的字符,它接收来自管道的输入,而不是直接处理文件。
语法格式
tr [选项] SET1 [SET2]
常用选项
| 选项 |
说明 |
-c |
使用SET1的补集 |
-d |
删除SET1中的字符 |
-s |
压缩重复字符 |
-t |
截断SET1,使其长度等于SET2 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
字符集表示方法
| 表示法 |
说明 |
示例 |
a-z |
所有小写字母 |
a-z |
A-Z |
所有大写字母 |
A-Z |
0-9 |
所有数字 |
0-9 |
[CHAR*] |
重复CHAR到SET2长度 |
[x*3]扩展为xxx |
[:alnum:] |
所有字母和数字 |
[:alnum:] |
[:alpha:] |
所有字母 |
[:alpha:] |
[:digit:] |
所有数字 |
[:digit:] |
[:lower:] |
所有小写字母 |
[:lower:] |
[:upper:] |
所有大写字母 |
[:upper:] |
[:space:] |
所有空白字符 |
[:space:] |
[:punct:] |
所有标点符号 |
[:punct:] |
使用示例
示例1:大小写转换
# 将小写转换为大写
echo "hello world" | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD
# 将大写转换为小写
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
# 输出:hello world
# 使用字符类
echo "Hello World" | tr '[:lower:]' '[:upper:]'
# 输出:HELLO WORLD
示例2:删除字符
# 删除所有数字
echo "abc123def456" | tr -d '0-9'
# 输出:abcdef
# 删除所有元音字母
echo "hello world" | tr -d 'aeiou'
# 输出:hll wrld
# 删除标点符号
echo "Hello, World!" | tr -d '[:punct:]'
# 输出:Hello World
示例3:压缩重复字符
# 压缩连续的空格
echo "hello world !" | tr -s ' '
# 输出:hello world !
# 压缩连续的换行符
echo -e "line1\n\n\nline2\n\nline3" | tr -s '\n'
# 输出:
# line1
# line2
# line3
# 压缩重复的字母
echo "aaabbbccc" | tr -s 'a-z'
# 输出:abc
示例4:字符替换
# 替换特定字符
echo "hello world" | tr ' ' ','
# 输出:hello,world
# 将tab转换为空格
echo -e "col1\tcol2\tcol3" | tr '\t' ' '
# 输出:col1 col2 col3
# 将Windows换行符转换为Unix换行符
cat windows.txt | tr '\r\n' '\n' > unix.txt
示例5:使用补集
# 删除所有非数字字符
echo "abc123def456" | tr -cd '0-9'
# 输出:123456
# 删除所有非字母字符
echo "abc123def456" | tr -cd '[:alpha:]'
# 输出:abcdef
# 保留字母和空格,删除其他所有字符
echo "Hello, World! 123" | tr -cd '[:alpha:][:space:]'
# 输出:Hello World
示例6:字符映射
# 简单的ROT13加密
echo "hello world" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
# 输出:uryyb jbeyq
# 解密ROT13
echo "uryyb jbeyq" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
# 输出:hello world
# 字符集对应替换
echo "12345" | tr '12345' 'abcde'
# 输出:abcde
示例7:实际应用场景
# 统计单词出现频率
echo "apple banana apple cherry banana apple" | tr ' ' '\n' | sort | uniq -c
# 清理CSV文件中的多余空格
cat data.csv | tr -s ' ' | tr ' ' ','
# 生成随机密码
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 12 | head -n 1
# 提取日志中的IP地址
cat access.log | tr -cd '0-9.\n' | grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}$'
# 转换文件编码
cat file.txt | tr '\r' '' > file_unix.txt
示例8:与文件结合使用
# 处理文件内容
tr 'a-z' 'A-Z' < input.txt > output.txt
# 处理多个文件
cat file1.txt file2.txt | tr 'a-z' 'A-Z' > combined.txt
# 直接修改文件(需要结合其他命令)
tr 'a-z' 'A-Z' < input.txt > tmp && mv tmp input.txt
示例9:高级技巧
# 删除文件中的空白行
cat file.txt | tr -s '\n' '\n'
# 将逗号分隔转换为制表符分隔
echo "a,b,c,d,e" | tr ',' '\t'
# 创建简单的凯撒密码
echo "hello" | tr 'a-z' 'd-za-c'
# 输出:khoor
# 十六进制转十进制
echo "A" | tr 'A-F' '10-15'
# 注意:这需要结合其他命令进行完整转换
注意:
- tr命令只能处理字符,不能处理字符串(如单词)
- SET1和SET2的长度应该相等,除非使用
-t选项截断
- tr命令不会直接修改文件,需要使用重定向保存结果
- 某些特殊字符需要使用引号或转义字符
- tr命令对字符进行一对一替换,不支持正则表达式
tr与其他命令组合
tr | sort | uniq - 统计字符频率
tr | grep - 转换后搜索
tr | sed - 字符转换后再编辑
tr | awk - 字符转换后分析
tr | wc - 字符转换后计数
cat | tr - 文件内容转换
性能优化技巧
- 对大型文件使用管道,避免内存溢出
- 使用字符类(如[:digit:])比指定范围更高效
- 组合多个tr操作为一个命令减少管道次数
- 对于简单字符处理,tr比sed和awk更快
- 使用
tr -s压缩字符比多次替换更高效
- 在处理前先用head命令测试小样本
tr vs sed vs awk
| 工具 |
字符处理 |
字符串处理 |
复杂模式 |
性能 |
tr |
优秀 |
不支持 |
不支持 |
最快 |
sed |
良好 |
良好 |
支持正则 |
中等 |
awk |
良好 |
优秀 |
支持完整编程 |
较慢 |
相关命令
sed - 流编辑器,支持复杂文本处理
awk - 文本分析处理工具
cut - 列提取工具
fold - 控制文本宽度
colrm - 删除指定列
iconv - 字符编码转换