tr
命令是 Linux/Unix 系统中用于字符转换或删除的实用工具,它从标准输入读取数据,根据指定规则处理字符后输出结果,是文本处理的利器,以下是详细用法指南:
核心功能与语法
基本语法:
tr [选项] '字符集1' '字符集2'
- 字符集1:待处理的原始字符集合
- 字符集2:替换后的目标字符集合
- 选项:控制处理行为(见下文)
⚠️ 注意:
tr
直接处理字符(而非字符串),不支持正则表达式。
常用选项详解
选项 | 作用 | 示例 |
---|---|---|
-d |
删除指定字符 | tr -d 'a' → 删除所有 a |
-s |
压缩重复字符 | tr -s ' ' → 将连续空格合并为单个空格 |
-c |
处理字符集的补集 | tr -cd '0-9' → 仅保留数字(删除非数字) |
经典使用场景与示例
字符替换
# 替换特定字符 echo "a-b-c" | tr '-' ':' # 输出: a:b:c
删除字符
# 删除所有数字 echo "user123" | tr -d '0-9' # 输出: user # 删除换行符(合并多行为单行) tr -d '\n' < file.txt
压缩重复字符
# 压缩连续空格 echo "Too many spaces" | tr -s ' ' # 输出: Too many spaces # 压缩重复字母 echo "woooow" | tr -s 'o' # 输出: woow
字符集补集操作
# 删除所有非数字字符 echo "Phone: 123-456" | tr -cd '0-9' # 输出: 123456 # 保留字母和空格 echo "Hello, 2025!" | tr -c -s 'a-zA-Z ' ' ' # 输出: Hello (逗号和数字被替换为空格并压缩)
特殊字符处理
# 转义特殊字符(如换行符 \n、制表符 \t) tr '[:lower:]' '[:upper:]' < input.txt # 使用预定义字符类 # 路径斜杠转换 echo "/home/user" | tr '/' '\\' # 输出: \home\user
高级技巧
字符类缩写
tr
支持预定义字符集,提高可读性:
[:lower:]
:小写字母a-z
[:upper:]
:大写字母A-Z
[:digit:]
:数字0-9
[:space:]
:空白字符(空格、制表符等)
示例:
# 删除所有标点 echo "Hello, World!" | tr -d '[:punct:]' # 输出: Hello World
字符映射
当字符集长度不等时:
- 若
字符集1 > 字符集2
:字符集1
中多余字符按字符集2
最后一个字符替换 - 若
字符集1 < 字符集2
:字符集2
多余部分被忽略
示例:
echo "abcde" | tr 'abc' '12' # a→1, b→2, c→2, d/e 不变 → 输出: 122de
常见错误与避坑指南
-
混淆字符与字符串
tr
无法替换字符串(如tr 'ab' 'cd'
会将a→c
,b→d
,而非替换子串 “ab”)。 -
未转义特殊字符
处理 、[
、]
等符号时需转义或用单引号包裹:echo "a-b" | tr '[:punct:]' '_' # 正确:将标点替换为下划线
-
输入输出重定向
tr
默认读取标准输入,处理文件时需用重定向:tr 'a' 'b' < input.txt > output.txt # 正确 tr 'a' 'b' input.txt # 错误!
tr
是高效处理字符级文本的必备工具,尤其擅长:
- 简单字符替换/删除
- 大小写转换
- 重复字符压缩
- 基于字符集的过滤
结合管道符 可嵌入复杂命令链(如 cat file | tr -d '\n' | sort
),掌握其灵活用法,能大幅提升终端操作效率。
基于 Linux 核心工具手册(man pages)及 GNU 官方文档整理,实践前建议通过 man tr
查看系统帮助。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7600.html