跳转到内容

tr

tr(来自单词 transform)是一个 Linux/Unix 命令行工具,用于对标准输入中的字符进行转换、删除或压缩,常与 cat、grep、sed、awk 等工具搭配使用。

Terminal window
tr [选项]... SET1 [SET2]
  • 选项:控制 tr 行为的选项
  • SET1:待替换的字符集
  • SET2:替换成的字符集

tr 不支持文件输入,必须通过标准输入传入数据

tr 的基础功能(不带任何选项)是进行字符替换(此时需要用到 SET2),删除、压缩功能需要使用对应的选项(此时不需要用到 SET2)。

替换规则

  • SET1 和 SET2 按位置一一对应替换
  • 若 SET1 长于 SET2,多余字符会被 SET2 的最后一个字符替换
  • tr 只能处理单个字符,不能替换字符串或单词(多字符)

tr 中的字符包含以下几种:

1. 普通字符

直接输入字符即可,包括字母、数字、标点和空格。示例:'abc'、'123'、'!@#'

2. 字符范围

用 - 表示连续字符序列,格式为 起始字符-结束字符,仅适用于 ASCII 码连续的字符:

  • a-z:所有小写字母
  • A-Z:所有大写字母
  • 0-9:所有数字
  • a-cx-z:等价于 abcxyz(多个范围组合)

范围必须是“从小到大”,如 z-a 是无效的 若需表示 - 本身,需放在字符集开头或结尾,例如 '-abc' 或 'abc-'

3. POSIX 字符类

写在 [:xxx:] 中的标准字符分类,可以替代具体字符范围,更可读、跨语言环境更可靠:

POSIX 类名 含义 等价范围
[:alnum:] 字母 + 数字 a-zA-Z0-9
[:alpha:] 所有字母 a-zA-Z
[:blank:] 空格 + tab " \t"
[:cntrl:] 控制字符 ASCII 控制码
[:digit:] 数字 0-9
[:lower:] 小写字母 a-z
[:upper:] 大写字母 A-Z
[:punct:] 标点符号 . , ; ! ? 等
[:space:] 所有空白字符 空格、tab、换行等
[:xdigit:] 十六进制字符 0-9A-Fa-f

4. 转义字符

可以用反斜线 \ 转义特殊字符或表示控制字符:

写法 含义
\n 换行
\t tab(制表符)
\\ 反斜线本身
选项 含义
-d 删除文本中所有在 SET1 中的字符(不需要 SET2)
-s 替换连续重复字符为单个字符(squeeze,不需要 SET2)
-c 取 SET1 的补集(complement)
--help 查看帮助文档
--version 查看版本信息

1. 替换小写字母为大写字母

Terminal window
echo "hello world" | tr 'a-z' 'A-Z'

输出:

HELLO WORLD

2. 替换数字为 #

Terminal window
echo "user1234" | tr '0-9' '#'

输出:

user####

3. 替换空格为下划线

Terminal window
echo "data science is fun" | tr ' ' '_'

输出:

data_science_is_fun

4. 替换多个字符为相同值(SET2 长度为 1)

Terminal window
echo "a b c d" | tr 'abcd' 'X'

输出:

X X X X

5. 替换换行符为逗号

Terminal window
printf "a\nb\nc\n" | tr '\n' ','

输出:

a,b,c,

6. 互换大小写

Terminal window
echo "Hello World" | tr 'a-zA-Z' 'A-Za-z'

输出:

hELLO wORLD

7. 删除文本中指定字符(-d)

Terminal window
echo "abc123xyz" | tr -d '0-9'

输出:

abcxyz

8. 将连续重复字符压缩成一个(-s)

Terminal window
echo "a b c" | tr -s ' '

输出:

a b c

9. 取补集 — 保留 SET1 中的字符,删除其余字符(-dc)

Terminal window
echo "Hello 123 World!" | tr -dc '[:alpha:]'

输出:

HelloWorld