tr 命令详解#
tr(translate)是 Linux 系统中用于字符转换和删除的命令。它可以对输入进行字符替换、删除和压缩,是文本处理和格式化的重要工具。
入门#
基本用法#
# 字符替换
tr 'a-z' 'A-Z' < filename.txt
# 删除字符
tr -d 'a-z' < filename.txt
# 压缩重复字符
tr -s ' ' < filename.txt
# 从标准输入处理
echo "hello" | tr 'a-z' 'A-Z'常用选项#
| 选项 | 说明 |
|---|---|
-d | 删除指定字符 |
-s | 压缩重复字符 |
-c | 补集操作 |
-t | 截断第一个集合 |
-C | 补集操作(使用POSIX字符类) |
基本示例#
# 转换大小写
tr 'a-z' 'A-Z' < filename.txt
# 删除数字
tr -d '0-9' < filename.txt
# 压缩空格
tr -s ' ' < filename.txt
# 删除换行符
tr -d '\n' < filename.txt中级#
字符替换#
# 小写转大写
tr 'a-z' 'A-Z' < filename.txt
# 大写转小写
tr 'A-Z' 'a-z' < filename.txt
# 替换特定字符
tr 'abc' 'xyz' < filename.txt
# 使用字符类
tr '[:lower:]' '[:upper:]' < filename.txt字符删除#
# 删除数字
tr -d '0-9' < filename.txt
# 删除标点符号
tr -d '[:punct:]' < filename.txt
# 删除空格
tr -d ' ' < filename.txt
# 删除换行符
tr -d '\n' < filename.txt字符压缩#
# 压缩空格
tr -s ' ' < filename.txt
# 压缩换行符
tr -s '\n' < filename.txt
# 压缩制表符
tr -s '\t' < filename.txt
# 压缩所有空白字符
tr -s '[:space:]' < filename.txt补集操作#
# 删除除字母外的所有字符
tr -cd '[:alpha:]' < filename.txt
# 删除除数字外的所有字符
tr -cd '[:digit:]' < filename.txt
# 删除除字母和数字外的所有字符
tr -cd '[:alnum:]' < filename.txt
# 删除除可打印字符外的所有字符
tr -cd '[:print:]' < filename.txt高级#
高级替换#
# 使用字符范围
tr 'a-zA-Z' 'n-za-mN-ZA-M' < filename.txt
# ROT13加密
tr 'A-Za-z' 'N-ZA-Mn-za-m' < filename.txt
# 替换控制字符
tr -d '[:cntrl:]' < filename.txt
# 替换八进制字符
tr '\0-\377' ' ' < filename.txt复杂转换#
# 转换Windows换行符为Unix换行符
tr -d '\r' < windows.txt > unix.txt
# 转换Unix换行符为Windows换行符
sed 's/$/\r/' unix.txt > windows.txt
# 删除所有空白字符
tr -d '[:space:]' < filename.txt
# 将制表符转换为空格
tr '\t' ' ' < filename.txt文本处理#
# 统计字符数
wc -c < filename.txt
# 统计单词数
wc -w < filename.txt
# 统计行数
wc -l < filename.txt
# 删除重复行(先排序)
sort filename.txt | uniq与其他命令组合#
# 转换并排序
tr 'a-z' 'A-Z' < filename.txt | sort
# 转换并去重
tr 'a-z' 'A-Z' < filename.txt | sort | uniq
# 转换并统计
tr 'a-z' 'A-Z' < filename.txt | wc -w
# 转换并过滤
tr 'a-z' 'A-Z' < filename.txt | grep "PATTERN"大师#
高级文本处理#
# 提取数字
tr -cd '0-9' < filename.txt
# 提取字母
tr -cd '[:alpha:]' < filename.txt
# 提取十六进制数字
tr -cd '0-9a-fA-F' < filename.txt
# 提取URL中的域名
echo "https://www.example.com/path" | tr -cd 'a-zA-Z0-9./'数据清洗#
# 清洗CSV文件
tr -d '\r' < data.csv > cleaned.csv
# 清洗日志文件
tr -d '[:cntrl:]' < log.txt > cleaned.log
# 清洗配置文件
tr -s ' ' < config.conf > cleaned.conf
# 清洗文本文件
tr -s '\n' < text.txt > cleaned.txt脚本集成#
# 文本转换脚本
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
tr 'a-z' 'A-Z' < "$INPUT" > "$OUTPUT"
# 数据清洗脚本
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
tr -cd '[:alnum:]' < "$INPUT" > "$OUTPUT"
# 格式化脚本
#!/bin/bash
INPUT="$1"
tr -s ' ' < "$INPUT" | tr '\t' ' ' > formatted.txt高级技巧#
# 使用八进制表示
tr '\011' ' ' < filename.txt
# 使用十六进制表示
tr '\x09' ' ' < filename.txt
# 使用反斜杠转义
tr '\\n' ' ' < filename.txt
# 使用POSIX字符类
tr '[:lower:]' '[:upper:]' < filename.txt无敌#
高级应用#
# Base64编码(简化版)
tr -d '[:space:]' < input.txt | base64
# URL编码
tr ' ' '+' < input.txt
# HTML实体编码
tr '<>&' 'XXX' < input.txt
# 密码生成
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 16大文件处理#
# 分块处理大文件
split -l 1000000 largefile.txt chunk_
for chunk in chunk_*; do
tr 'a-z' 'A-Z' < "$chunk" > "$chunk.processed"
done
cat chunk_*.processed > final_result.txt
# 使用管道处理
cat largefile.txt | tr 'a-z' 'A-Z' > output.txt
# 并行处理
find . -name "*.txt" -exec sh -c 'tr "a-z" "A-Z" < "$1" > "$1.upper"' _ {} \;自动化工作流#
# 自动化文本转换
#!/bin/bash
INPUT_DIR="./input"
OUTPUT_DIR="./output"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.txt; do
filename=$(basename "$file")
tr 'a-z' 'A-Z' < "$file" > "$OUTPUT_DIR/$filename"
done
# 自动化数据清洗
#!/bin/bash
INPUT_DIR="./input"
OUTPUT_DIR="./output"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.csv; do
filename=$(basename "$file")
tr -d '\r' < "$file" > "$OUTPUT_DIR/$filename"
done
# 自动化格式化
#!/bin/bash
INPUT_DIR="./input"
OUTPUT_DIR="./output"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.txt; do
filename=$(basename "$file")
tr -s '[:space:]' < "$file" > "$OUTPUT_DIR/$filename"
done性能调优#
# 监控性能
time tr 'a-z' 'A-Z' < largefile.txt
# 使用 strace 分析
strace -c tr 'a-z' 'A-Z' < largefile.txt
# 使用 valgrind 分析内存
valgrind --tool=massif tr 'a-z' 'A-Z' < largefile.txt
# 优化处理
tr -cd '[:alnum:]' < largefile.txt | sort -S 1G高级应用场景#
# 文件名规范化
ls | tr ' ' '_' | xargs -I {} mv {} {}
# 密码生成
tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c 20
# 随机字符串生成
tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 16
# 文本规范化
tr -s '[:space:]' < input.txt | tr '[:upper:]' '[:lower:]' > output.txt最佳实践#
1. 使用场景#
- 字符转换和替换
- 文本清洗和规范化
- 数据格式转换
- 密码和随机字符串生成
2. 性能优化#
- 对于大文件,使用管道处理
- 避免复杂的字符类
- 合理使用 -s 选项压缩字符
- 使用补集操作提高效率
3. 数据处理#
- 先过滤再转换,减少处理数据量
- 使用字符类简化表达式
- 结合其他命令进行复杂处理
- 注意字符编码问题
4. 脚本集成#
- 在脚本中使用管道组合命令
- 处理错误和异常情况
- 使用变量和参数化脚本
- 添加日志和调试信息
5. 学习路径#
- 先掌握基本替换和删除
- 学习字符压缩和补集操作
- 掌握高级转换和文本处理
- 学习脚本集成和自动化
- 最后学习性能优化
常见问题#
Q: tr 和 sed 有什么区别?#
A: tr 专门用于字符级别的转换和删除,sed 用于行级别的文本处理和替换。
Q: 如何删除所有非字母字符?#
A: 使用 tr -cd '[:alpha:]' < filename.txt
Q: 如何转换大小写?#
A: 使用 tr 'a-z' 'A-Z' 转换为小写,tr 'A-Z' 'a-z' 转换为大写。
Q: 如何压缩连续的空格?#
A: 使用 tr -s ' ' < filename.txt
Q: 如何处理特殊字符?#
A: 使用反斜杠转义或八进制/十六进制表示,如 tr '\n' ' ' 或 tr '\012' ' '。
相关命令#
sed- 流编辑器awk- 文本处理语言cut- 字段提取paste- 合并行fold- 折叠文本