Linux tr命令详细使用教程

简介: tr是Linux中轻量高效的字符处理命令,专注字符翻译、重复压缩与指定删除,纯内存流式处理。本文详解其语法、四大选项(-c/-d/-s/-t)、字符集写法(范围/转义/字符类等)及10+实战场景,助新手快速掌握核心用法。

tr命令是Linux系统中处理字符的“轻量小能手”,主打字符翻译、重复字符压缩、指定字符删除三大核心功能,它从标准输入读取字符流,处理后直接输出到标准输出,没有文件读写的能力,纯内存字符流处理,在日常文本快速处理、脚本编写中特别实用。

本文会从基础语法、核心选项、字符集表示方法,到经典实用场景,用浅显的语言+丰富示例讲透tr命令,新手也能快速上手。

一、初识tr命令:语法与核心作用

1. 基本语法

tr [OPTION]... STRING1 [STRING2]
  • OPTION:tr的功能选项,必须写在字符集前面,多个选项可组合使用;
  • STRING1/STRING2:字符集,tr会将其解析为字符数组ARRAY1/ARRAY2,绝大多数场景下STRING2可选;
  • 核心作用:根据选项规则,对输入中属于ARRAY1的字符进行处理,非ARRAY1的字符会原封不动输出。

2. 核心处理能力

tr命令本质上只做四类操作,所有用法都是这四类的组合:

  1. 字符翻译(需同时指定STRING1和STRING2);
  2. 仅压缩重复字符(仅指定STRING1+对应选项);
  3. 仅删除指定字符(仅指定STRING1+对应选项);
  4. 先删除指定字符,再压缩结果中的重复字符(组合选项)。

二、tr核心选项详解

tr的选项不多,共4个核心功能选项,均支持短选项长选项,下面逐个讲解每个选项的作用,并搭配简单示例帮助理解(示例中用echo提供标准输入,是tr最常用的使用方式)。

1. -c/--complement:取字符集的补集

作用:不处理STRING1中的字符,反而处理所有不在STRING1中的字符(补集),字符按ASCII码升序排列。
注意:在UTF-8等多字节字符集的系统中使用需谨慎,易出现非预期结果,建议加LC_ALL=C强制单字节解析。
示例:保留输入中的数字,将其他所有字符替换为星号*

# 输入:abc123def456,保留数字,其余替换为*
echo "abc123def456" | tr -c '0-9' '*'
# 输出:***123***456

2. -d/--delete:删除指定字符

作用:删除输入中属于STRING1的所有字符,此选项下无需指定STRING2(指定了也会被忽略)。
核心:纯删除,无其他额外处理。
示例1:删除输入中的小写字母

echo "Hello123World456" | tr -d 'a-z'
# 输出:H123W456

示例2:删除输入中的特殊符号@#

echo "test@123#linux" | tr -d '@#'
# 输出:test123linux

3. -s/--squeeze-repeats:压缩重复字符

作用:将输入中连续重复的指定字符,压缩为单个字符;若和翻译/删除选项组合,会在翻译/删除后执行压缩。

  • 仅用-s时:压缩STRING1中的连续重复字符;
  • 组合其他选项时:压缩最后一个指定字符集中的连续重复字符。
    示例1:压缩连续的数字
    echo "111222333linux444" | tr -s '0-9'
    # 输出:123linux4
    
    示例2:压缩连续的空格(日常最实用的场景之一)
    echo "linux  is  a  free  os" | tr -s ' '
    # 输出:linux is a free os
    

4. -t/--truncate-set1:截断字符集1

作用:仅在字符翻译场景下生效(同时指定STRING1和STRING2),将STRING1截断为和STRING2相同的长度,避免字符集长度不一致导致的非预期翻译。
背景:GNU tr默认兼容BSD风格,若STRING1比STRING2长,会将STRING2的最后一个字符重复,补齐到和STRING1同长度;而-t会让tr按System V风格处理,直接截断STRING1。
示例:对比有无-t的翻译结果

# 无-t:STRING1(abc)比STRING2(xy)长,将y重复,a→x,b→y,c→y
echo "abc" | tr 'abc' 'xy'
# 输出:xyy

# 有-t:截断STRING1为ab,a→x,b→y,c不处理(原封不动)
echo "abc" | tr -t 'abc' 'xy'
# 输出:xyc

三、tr的字符集花式表示法

tr的STRING1和STRING2不是正则表达式,只是字符数组,但支持多种字符集简写方式,这是tr的核心灵活点,也是新手容易搞混的地方,下面讲透所有合法的字符表示方法。

1. 普通字符

直接写字符即可,适用于少量字符的场景,例如:

# 将a换成x,b换成y
echo "abcab" | tr 'ab' 'xy'
# 输出:xycxy

2. 转义序列

支持常见的转义字符,用于表示不可见的控制字符,核心转义序列如下:
| 转义序列 | 含义 | 转义序列 | 含义 |
|----------|--------------|----------|--------------|
| \a | 响铃(Ctrl+G)| \n | 换行(Ctrl+J)|
| \b | 退格(Ctrl+H)| \r | 回车(Ctrl+M)|
| \f | 换页(Ctrl+L)| \t | 制表符(Tab)|
| \v | 垂直制表符 | \ | 反斜杠本身 |
| \OOO | 八进制数表示的字符(1-3位) | - | - |

示例:将制表符\t替换为空格

echo "linux\tis\tfree" | tr '\t' ' '
# 输出:linux is free

示例:用八进制\012表示换行(等价于\n)

echo "linux is free" | tr ' ' '\012'
# 输出:linux
# is
# free

3. 字符范围:M-N

M-N表示从字符M到字符N的连续字符,按ASCII码升序排列,适用于连续字符的场景,例如:

  • 0-9:所有数字
  • a-z:所有小写字母
  • A-Z:所有大写字母
  • a-Z:所有大小写字母(部分系统支持)

示例:小写字母转大写字母

echo "hello linux" | tr 'a-z' 'A-Z'
# 输出:HELLO LINUX

注意:字符范围仅在Clocale下可移植,EBCDIC编码的系统中A-Z并非连续,建议优先用字符类(下文)。

4. 重复字符:[CN] / [C]

仅在STRING2中生效,用于快速生成重复的字符,避免手动输入多次:

  • [C*N]:生成N个字符C(N为数字,0开头表示八进制,0值则忽略);
  • [C*]:将C重复,补齐到和STRING1相同的长度。

示例1:生成6个y,替换数字0-9为y([y*6]仅前6个数字替换为y,后4个按GNU默认规则也替换为y)

echo "1234567890" | tr '0-9' '[y*6]'
# 输出:yyyyyyyyyy

示例2:将所有非字母的字符替换为换行(用[\n*]自动补齐补集长度)

echo "linux123is@free" | tr -c 'a-z' '[\n*]'
# 输出:linux
# is
# free

5. 预定义字符类:[:CLASS:]

最推荐的方式,可移植性最高,用[:CLASS:]表示一类字符,注意前后的冒号不能少,核心字符类如下(必记):
| 字符类 | 含义 | 字符类 | 含义 |
|----------|----------------------|----------|----------------------|
| [:alnum:]| 字母+数字 | [:digit:]| 数字0-9 |
| [:alpha:]| 大小写字母 | [:lower:]| 小写字母a-z |
| [:blank:]| 水平空白(空格+Tab) | [:upper:]| 大写字母A-Z |
| [:space:]| 所有空白(含换行/回车)| [:punct:]| 所有标点符号 |
| [:cntrl:]| 所有控制字符 | [:print:]| 可打印字符(含空格) |
| [:graph:]| 可打印字符(不含空格)| [:xdigit:]| 十六进制数字 |

核心规则

  • 仅删除/压缩时,字符类可在STRING1/STRING2任意位置;
  • 字符翻译时,仅[:lower:][:upper:]可在STRING2中使用,且需和STRING1的对应类位置一致(用于大小写转换)。

示例1:用字符类实现小写转大写(最便携)

echo "hello LINUX" | tr '[:lower:]' '[:upper:]'
# 输出:HELLO LINUX

示例2:删除所有标点符号

echo "hello! linux, how are you?" | tr -d '[:punct:]'
# 输出:hello linux how are you

6. 等价类:[=C=]

基本无实用价值,本意是表示和字符C等价的所有字符(适配非英语字母),但GNU tr中每个字符的等价类只有自己,因此几乎不用,了解即可。

四、tr经典实用场景(组合用法)

tr的强大之处在于选项组合+字符集灵活搭配,下面讲解日常工作中最常用的场景,覆盖翻译、删除、压缩的各种组合,直接抄作业即可。

场景1:大小写转换(最常用)

三种实现方式,推荐第三种字符类方式,可移植性最高:

# 方式1:手动写字母
echo "Hello Linux" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 方式2:字符范围
echo "Hello Linux" | tr 'a-z' 'A-Z'
# 方式3:字符类(推荐)
echo "Hello Linux" | tr '[:lower:]' '[:upper:]'

# 大写转小写,反向即可
echo "Hello Linux" | tr '[:upper:]' '[:lower:]'

场景2:清理文本中的空行/连续换行

-s压缩连续的换行符\n,直接消除空行:

# 原始输入有连续换行,压缩为单个换行
echo -e "linux\n\n\nis\n\nfree" | tr -s '\n'
# 输出:
# linux
# is
# free

# 也可将换行压缩为空格,把多行转为一行
echo -e "linux\nis\nfree" | tr -s '\n' ' '
# 输出:linux is free

场景3:删除文本中的所有数字/字母

结合-d和字符类,精准删除指定类型字符:

# 删除所有数字
echo "linux123is456free789" | tr -d '[:digit:]'
# 输出:linuxisfree

# 删除所有字母
echo "linux123is456free789" | tr -d '[:alpha:]'
# 输出:123456789

场景4:将所有非字母/数字的字符替换为换行

结合-c(补集)和-s(压缩),实现“按字母/数字分割行”,适合提取文本中的关键词:

# 非字母数字替换为换行,再压缩连续换行
echo "linux!123is@free#os" | tr -cs '[:alnum:]' '[\n*]'
# 输出:
# linux
# 123
# is
# free
# os

场景5:删除文本中的控制字符/特殊字符

Linux文本文件中常出现^M(\r)等Windows控制字符,用tr快速删除:

# 删除回车符\r(解决Windows文件在Linux中的换行问题)
cat test.txt | tr -d '\r' > new_test.txt

# 删除所有控制字符
cat test.txt | tr -d '[:cntrl:]' > new_test.txt

场景6:统计文本中单词的重复次数

结合tr和uniq,先将文本处理为“一行一个单词”,再统计重复项,这是tr在脚本中的经典用法:

# 脚本实现:提取重复单词,忽略大小写和标点
cat text.txt \
| tr -s '[:punct:][:blank:]' '[\n*]' \  # 标点/空白替换为换行,压缩连续换行
| tr '[:upper:]' '[:lower:]' \            # 全部转为小写
| uniq -d                                 # 仅显示重复的行(重复单词)

场景7:批量替换指定字符(多字符替换)

tr支持多字符一对一翻译,按字符集的顺序依次替换:

# 将a→1,b→2,c→3
echo "abcabc123" | tr 'abc' '123'
# 输出:123123123

# 将空格→_,Tab→-
echo "linux is\tfree" | tr ' \t' '_-'
# 输出:linux_is-free

五、tr使用的注意事项(避坑点)

  1. tr不支持多字节字符:UTF-8中的中文、特殊字母(ö、Ł)等多字节字符,tr会按单字节解析,导致乱码,处理多字节字符建议用sed/awk
  2. 字符范围的可移植性a-z/A-Z仅在Clocale下有效,跨系统建议用[:lower:]/[:upper:]
  3. 连字符-的处理:若要处理-本身,需将其放在字符集最后,或用--终止选项解析:
    # 正确删除-:放在最后
    echo "linux-123-os" | tr -d '0-9-'
    # 正确删除-:用--终止选项
    echo "linux-123-os" | tr -d -- '-0-9'
    
  4. STRING1重复字符的处理:若STRING1中有重复字符,GNU tr会取最后一个作为有效映射:
    # a出现3次,取最后一个,a→z
    echo "abc" | tr 'aaa' 'xyz'
    # 输出:zbc
    
  5. tr是按字符处理,非按字符串:tr只能处理单个字符,无法替换多字符的字符串,替换字符串建议用sed

六、tr的退出状态

  • 0:执行成功,无错误;
  • 非0:执行失败(如选项错误、字符集格式错误、输入流异常等)。

日常工作中,tr常和echo/cat/uniq/sort等命令配合使用,在文本快速处理、shell脚本中能大幅提升效率,熟记本文的经典示例,即可解决90%的字符处理需求。

相关文章
|
11天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
7天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
4166 12
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
8天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4632 14
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
5天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
2886 7
|
10天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7162 16
|
7天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
4873 5
|
10天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
4766 23
|
16天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
8841 13