tr 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。它只认字符、不认"词",做字符级替换极快。
tr(translate,转换)从 stdin 读字符,按规则逐字符改写后输出。它只处理单个字符,不能替换字符串(那是 sed 的活,见sed)。
一、基本用法:字符替换
bash
echo "hello" | tr 'a-z' 'A-Z' # 全转大写:HELLO
echo "HELLO" | tr 'A-Z' 'a-z' # 全转小写
cat file | tr ' ' '_' # 空格换成下划线
tr SET1 SET2把出现在 SET1 的字符映射到 SET2 对应位置。大小写互转是最常见用法。注意是字符对字符,不是字符串替换。
二、删除字符:-d
bash
echo "hello123" | tr -d '0-9' # 删数字:hello
cat file | tr -d '\r' # 删 Windows 回车符(去 CRLF)
-d(delete)删除指定字符集,常用于清洗:去掉数字、去掉\r(跨平台文本)、去掉控制字符。
三、压缩重复:-s
bash
echo "aaabbb" | tr -s 'a' # 把连续 a 压成单个:abbb
cat file | tr -s ' ' # 多个空格压成一个
echo "a b" | tr -s ' \n' ' ' # 压缩空格和换行
-s(squeeze)把连续重复的字符压成一个,整理空白分隔很实用(比如把多个空格变单个,方便 cut 按列切)。
四、局限与配合
bash
# tr 不支持字符串替换、不支持正则
# 需要字符串级替换用 sed:sed 's/foo/bar/g'
tr只做字符级变换,没有正则、不能替换多字符子串。要替换词/模式,用 sed。但 tr 处理字符流比 sed 轻快,纯大小写/删字符/压空白优先 tr。
一句话总结
tr = 字符级转换(只认字符不认词):'a-z' 'A-Z' 大小写互转、-d 删字符(如去 \r)、-s 压缩重复(多空格压一个);不支持字符串/正则替换(那是 sed 的活);纯字符清洗比 sed 轻快。