Linux tr命令(长文解析)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Linux 系统中,文本处理是一项基础且高频的操作。无论是日志分析、代码优化,还是数据清洗,开发者常常需要快速对文本内容进行格式调整或字符替换。此时,一个轻量但功能强大的工具——tr
命令,便能发挥重要作用。它如同文本处理的“瑞士军刀”,以简洁的语法实现高效操作。本文将从零开始讲解 tr
命令的核心功能,并通过实际案例帮助读者理解其应用场景,适合编程初学者和中级开发者逐步掌握。
一、tr命令基础:字符替换与删除
1.1 命令简介与核心语法
tr
(translate)是 Linux 中用于处理单字节字符的过滤工具,其核心功能包括:
- 字符替换:将输入文本中的指定字符替换成其他字符
- 字符删除:移除输入文本中匹配的字符
- 字符压缩:合并连续重复的字符
其基本语法如下:
tr [选项] "替换前字符集" "替换后字符集"
1.2 基础案例:大小写转换与字符删除
案例1:将文本中的小写字母替换为大写字母
echo "Hello World" | tr "a-z" "A-Z"
这里 tr
将输入流中的每个小写字母(a-z
)替换为对应的大写字母(A-Z
)。
案例2:删除文本中的换行符
echo -e "Line1\nLine2" | tr -d "\n"
通过 -d
选项,tr
删除了所有换行符(\n
),使两行文本合并为一行。
1.3 字符集表示法:区间与集合的灵活组合
tr
支持以下字符集表示方式:
- 单字符:如
a
、$
- 区间:
a-z
(小写字母)、0-9
(数字) - 预定义字符类:
[:alnum:]
:字母与数字[:space:]
:空白字符(空格、制表符、换行等)
案例3:统计文件中的单词数量
cat file.txt | tr -s "[:space:]" | tr "[:space:]" "\n" | wc -l
tr -s "[:space:]"
:合并连续空白字符tr "[:space:]" "\n"
:将空白字符替换为换行符,使每个单词单独成行wc -l
:统计行数,即单词数量
二、进阶功能:合并、取反与复杂模式
2.1 合并重复字符:压缩冗余内容
通过 -s
(squeeze-repeats)选项,tr
可将连续重复的字符压缩为单个实例。
案例4:清理日志中的多余空格
echo "Error occurred in line 42" | tr -s " "
此处将多个空格压缩为单个空格,使日志更易读。
2.2 取反操作:反向筛选字符集
使用 --complement
(或 -c
)选项,可选择“非指定字符集”进行操作。
案例5:提取文件中的非字母字符
echo "abc123XYZ!@#" | tr -c "[:alpha:]" "\n"
这里:
-c "[:alpha:]
表示“非字母字符”- 将非字母字符替换为换行符,使字母字符保留并分行显示
2.3 删除模式:精准过滤文本
tr
的 -d
选项可结合取反功能,实现复杂删除逻辑。
案例6:仅保留数字与小写字母
echo "User123@Domain.com" | tr -cd "a-z0-9"
-c
取反后,保留的是非a-z0-9
的字符-d
删除这些非目标字符,最终保留所需内容
三、实际应用场景与代码示例
3.1 场景1:处理CSV文件中的特殊符号
假设 CSV 文件中存在双引号导致解析错误,可使用 tr
替换为单引号:
cat data.csv | tr '"' "'" > cleaned_data.csv
3.2 场景2:将二进制文件转为十六进制
配合 xxd
工具,tr
可辅助格式转换:
cat binary_file | xxd -p | tr -d "\n" > hex_output.txt
xxd -p
将二进制转为十六进制tr -d "\n"
删除换行符,生成连续字符串
3.3 场景3:自动化脚本中的字符规范化
在脚本中标准化用户输入:
read -p "Enter your name: " name
cleaned_name=$(echo "$name" | tr -s " " | tr "[:upper:]" "[:lower:]")
echo "Welcome, $cleaned_name!"
此脚本将用户输入的姓名转为小写,并合并多余空格。
四、常见问题与解决方案
4.1 问题1:处理多字节字符时出现乱码
tr
默认仅处理单字节字符,遇到 Unicode 或多字节字符(如中文)时可能失效。解决方案包括:
- 使用
--byte
选项强制按字节处理:tr --byte "多" "少" < input.txt
- 转而使用
sed
或awk
等支持多字节的工具
4.2 问题2:BSD与GNU版本的差异
- BSD系统(如 macOS)的
tr
不支持-c
与-s
组合,需改用[:space:]
等字符类 - GNU系统(如 Ubuntu)则兼容更多选项
4.3 问题3:替换字符数量不匹配
当替换字符集长度不同时,tr
会循环使用较短的字符集。例如:
echo "abcdef" | tr "abc" "1"
此时 1
会循环替换 a
、b
、c
,多余字符保留。
五、与同类工具的对比
5.1 tr vs. sed
- tr:轻量高效,适合简单字符替换和删除
- sed:功能更强大,支持正则表达式和复杂模式
- 典型场景:
tr
替换单字符:tr "a" "b"
sed
替换多模式:sed 's/[a-z]/X/g'
5.2 tr vs. awk
- tr:专注单字符操作,无上下文逻辑
- awk:可结合条件判断处理文本,适合复杂逻辑
- 示例对比:
tr
删除空行:tr -d "\n"
(需配合其他工具)awk
删除空行:awk '/./'
结论
tr
命令凭借其简洁的语法和高效的文本处理能力,在 Linux 开发中占据重要地位。通过掌握其基础操作、进阶选项及实际应用场景,开发者能显著提升文本处理效率。无论是快速清理日志、规范化输入数据,还是构建自动化脚本,tr
都是值得深入学习的工具。建议读者通过实践案例逐步熟悉其特性,并结合其他工具(如 sed
、awk
)构建更强大的文本处理流程。
提示:本文中的所有代码示例均可在终端直接执行验证。若需深入探索,可查阅
man tr
获取完整参数列表。