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 - 折叠文本