linux tr命令

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 - 字符编码转换