1. 命令概述
- 命令名称:
tr(英文全拼:translate) - 核心功能:字符转换和删除,对标准输入的字符进行替换、删除、压缩等操作
- 主要用途:字符替换、大小写转换、删除字符、压缩重复字符
- 特点:轻量级、高效、支持字符集和范围
2. 语法格式
tr [选项] 字符集1 字符集2
tr [选项] -d 字符集
tr [选项] -s 字符集
3. 常用选项
| 选项 | 说明 |
|---|---|
-c | 使用字符集1的补集 |
-d | 删除字符集1中的字符 |
-s | 压缩重复字符 |
-t | 截断字符集1,使其长度等于字符集2 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4. 基本操作
(1) 字符替换
# 将小写字母转换为大写
echo "hello world" | tr 'a-z' 'A-Z'
# 将大写字母转换为小写
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
# 将数字转换为星号
echo "12345" | tr '0-9' '*'
# 将空格转换为换行符
echo "a b c" | tr ' ' '\n'
# 将换行符转换为空格
echo -e "a\nb\nc" | tr '\n' ' '
(2) 删除字符
# 删除数字
echo "abc123def" | tr -d '0-9'
# 删除字母
echo "abc123def" | tr -d 'a-z'
# 删除标点符号
echo "hello, world!" | tr -d '[:punct:]'
# 删除空白字符
echo "hello world" | tr -d '[:space:]'
# 删除非数字字符
echo "abc123def" | tr -cd '0-9'
(3) 压缩字符
# 压缩连续空格
echo "hello world" | tr -s ' '
# 压缩连续换行符
echo -e "a\n\n\nb\nc" | tr -s '\n'
# 压缩连续制表符
echo -e "a\t\t\tb\tc" | tr -s '\t'
# 压缩连续相同字符
echo "aaabbbccc" | tr -s 'abc'
(4) 补集操作
# 删除非数字字符
echo "abc123def" | tr -cd '0-9'
# 删除非字母字符
echo "abc123def" | tr -cd 'a-zA-Z'
# 删除非打印字符
echo -e "hello\x01world" | tr -cd '[:print:]'
# 保留字母和数字
echo "abc123!@#" | tr -cd '[:alnum:]'
5. 常用实例详解
(1) 大小写转换
# 全部转换为大写
echo "Hello World" | tr '[:lower:]' '[:upper:]'
# 全部转换为小写
echo "Hello World" | tr '[:upper:]' '[:lower:]'
# 首字母大写(需要配合其他命令)
echo "hello world" | tr '[:lower:]' '[:upper:]' | sed 's/^\(.\)/\1/'
(2) 数字处理
# 提取数字
echo "abc123def456" | tr -cd '0-9'
# 提取电话号码
echo "Phone: 123-456-7890" | tr -cd '0-9'
# 格式化数字(每三位加逗号)
echo "1234567890" | rev | tr '0-9' '9876543210' | sed 's/.../&,/g' | rev | sed 's/^,//'
# 删除数字
echo "abc123def456" | tr -d '0-9'
(3) 空白字符处理
# 删除行首空格
echo " hello" | tr -d '[:space:]'
# 删除行尾空格
echo "hello " | tr -d '[:space:]'
# 删除所有空白字符
echo "hello world" | tr -d '[:space:]'
# 压缩连续空格
echo "hello world" | tr -s ' '
# 将制表符转换为空格
echo -e "hello\tworld" | tr '\t' ' '
(4) 特殊字符处理
# 删除控制字符
echo -e "hello\x01world" | tr -d '[:cntrl:]'
# 删除不可打印字符
echo -e "hello\x01world" | tr -cd '[:print:]'
# 删除标点符号
echo "hello, world!" | tr -d '[:punct:]'
# 删除字母和数字
echo "abc123!@#" | tr -d '[:alnum:]'
6. 实际应用场景
场景一:文本格式化
# 将文件内容转换为大写
tr 'a-z' 'A-Z' < file.txt
# 将文件内容转换为小写
tr 'A-Z' 'a-z' < file.txt
# 删除文件中的数字
tr -d '0-9' < file.txt
# 删除文件中的标点符号
tr -d '[:punct:]' < file.txt
# 压缩文件中的连续空格
tr -s ' ' < file.txt
场景二:数据清洗
# 提取CSV文件中的数字
cut -d, -f2 data.csv | tr -cd '0-9'
# 提取日志文件中的IP地址
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log | tr -d ' '
# 提取配置文件中的配置值
grep '^[^#]' config.conf | tr -d '[:space:]'
# 提取代码中的注释
grep '#' *.py | tr -d '[:space:]'
场景三:系统管理
# 统计文件行数(去除空行)
cat file.txt | tr -s '\n' | wc -l
# 统计单词数量
cat file.txt | tr -s ' ' '\n' | wc -l
# 统计字符数量(去除空格)
cat file.txt | tr -d '[:space:]' | wc -c
# 统计不同字符数量
cat file.txt | tr -cd '[:print:]' | fold -w1 | sort | uniq | wc -l
场景四:密码生成
# 生成随机密码(字母和数字)
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 12
# 生成随机密码(大小写字母和数字)
cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 16
# 生成随机密码(特殊字符)
cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%^&*()' | head -c 20
# 生成随机字符串
cat /dev/urandom | tr -dc 'a-z' | head -c 8
7. 与其他命令的区别
| 命令 | 特点 | 适用场景 |
|---|---|---|
tr | 字符转换和删除 | 字符替换、大小写转换 |
sed | 流编辑器,支持正则表达式 | 复杂文本替换、删除 |
awk | 文本处理工具,支持字段处理 | 复杂文本处理、报表生成 |
cut | 按列提取文本 | 提取指定列 |
grep | 文本搜索工具 | 模式匹配、搜索 |
8. 注意事项
- 字符集长度:字符集1和字符集2的长度应该相同,否则使用
-t选项截断 - 特殊字符:特殊字符需要转义或使用字符类
- 标准输入:
tr只能处理标准输入,不能直接处理文件 - 字符类:支持预定义的字符类,如
[:lower:]、[:upper:]、[:digit:]等 - 性能:
tr处理速度很快,适合处理大文件
9. 常见问题解决
(1) 字符集长度不匹配
# 字符集1比字符集2长,使用-t选项截断
echo "abcdef" | tr -t 'abcdef' 'ABC'
# 字符集1比字符集2短,字符集2会被截断
echo "abcdef" | tr 'abc' 'ABC'
# 使用字符类
echo "abcdef" | tr 'a-z' 'A-Z'
(2) 特殊字符转义
# 转义换行符
echo "hello world" | tr ' ' '\n'
# 转义制表符
echo "hello world" | tr ' ' '\t'
# 转义回车符
echo "hello world" | tr ' ' '\r'
# 转义退格符
echo "hello world" | tr ' ' '\b'
(3) 字符类使用
# 使用预定义字符类
echo "Hello World" | tr '[:lower:]' '[:upper:]'
# 使用数字字符类
echo "abc123def" | tr -d '[:digit:]'
# 使用字母字符类
echo "abc123def" | tr -d '[:alpha:]'
# 使用空白字符类
echo "hello world" | tr -s '[:space:]'
# 使用标点符号字符类
echo "hello, world!" | tr -d '[:punct:]'
(4) 多字符替换
# 替换多个字符
echo "abc123def" | tr 'abc' 'ABC'
# 替换字符范围
echo "abc123def" | tr 'a-z' 'A-Z'
# 替换非连续字符
echo "abc123def" | tr 'adf' 'ADF'
# 使用字符集
echo "abc123def" | tr 'abcdef' 'ABCDEF'
核心要点总结:
tr是字符转换和删除工具,用于对标准输入的字符进行替换、删除、压缩等操作- 常用选项:
-d(删除字符)、-s(压缩重复字符)、-c(使用补集) - 字符类:支持预定义的字符类,如
[:lower:]、[:upper:]、[:digit:]等 - 实际应用:大小写转换、字符删除、空白字符处理、数据清洗
- 注意事项:字符集长度应该相同,特殊字符需要转义
tr命令是Linux系统中最常用的文本处理工具之一,熟练掌握可以大大提高文本处理效率。