tr命令用法详解与技巧总结

tr(translate)是Linux/Unix中用于字符级转换、删除和压缩的流处理工具。它设计简洁高效,特别适合在管道中与其他命令配合使用。

下面是它的核心功能与语法概览:

项目 说明
核心功能 字符转换、删除指定字符、压缩(缩减)连续重复字符。
关键特性 仅处理字符 ,不支持字符串;从标准输入读取数据,输出到标准输出。
基本语法 tr [选项] 字符集1 [字符集2]
常用选项 -c / -C:使用字符集1的补集 -d删除 属于字符集1的字符 -s:将字符集1中列出的连续重复字符压缩为单个 -t:将字符集1的长度截断为与字符集2相等

📖 理解字符集表示

tr 的强大之处在于灵活的字符集定义:

  • 范围表示[a-z](小写字母), [A-Z], [0-9]

  • 组合与枚举[a-z0-9](小写字母和数字), [abcxyz](特定字符)。

  • 预定义字符类(更可读、可移植):

    表示 含义
    [:alnum:] 字母和数字
    [:alpha:] 字母
    [:digit:] 数字
    [:lower:] 小写字母
    [:upper:] 大写字母
    [:space:] 所有空白字符(空格、制表符、换行等)
  • 特殊字符转义 :用 \n(换行)、\t(水平制表符)、\r(回车)等表示控制字符。

🔧 核心功能详解与技巧

1. 字符替换

这是最基本的功能,将字符集1中的字符一对一替换为字符集2中的对应字符。

  • 基本替换echo "hello" | tr 'el' 'ip' 输出 hippo(e->i, l->p)。

  • 大小写转换

bash 复制代码
echo "Hello World" | tr 'a-z' 'A-Z'  # 输出 HELLO WORLD
echo "Hello World" | tr '[:lower:]' '[:upper:]'  # 同上,使用字符类[citation:3][citation:7]

使用补集替换 (-c)替换所有不属于字符集1的字符 。常与 -d-s 联用。

bash 复制代码
# 只保留数字和换行,其他所有字符被删除
echo "Phone: 123-4567" | tr -cd '[:digit:]\n'
# 输出 1234567
2. 字符删除

使用 -d 选项直接删除所有出现在字符集1中的字符。

bash 复制代码
# 删除所有数字
echo "my phone is 12345" | tr -d '[:digit:]'
# 输出 my phone is 

# 删除特定字符(如删除windows文件换行符^M)
cat windows_file.txt | tr -d '\r' > unix_file.txt[citation:6]
3. 字符缩减(压缩)

使用 -s 选项,将连续重复出现的字符压缩为单个

bash 复制代码
# 压缩多余的空格
echo "too    many     spaces" | tr -s ' '
# 输出 too many spaces[citation:10]

# 压缩空行(本质是压缩连续的换行符)
cat file_with_blanks.txt | tr -s '\n'

# 先转换再压缩:将非字母字符替换为换行,然后压缩换行符,实现"分词"
echo "hello,world;foo|bar" | tr -cs '[:alpha:]' '\n'
# 输出 
# hello
# world
# foo
# bar

💡 经典应用场景

文本清理与格式化

bash 复制代码
# 将文件中的制表符替换为空格
cat file.txt | tr '\t' ' '

# 将连续的分隔符(如逗号、空格)统一为一个逗号
echo "a,b,,c   d" | tr -s ', ' ','  # 输出 a,b,c,d(注意处理逻辑)

简单编码与加密

bash 复制代码
# 实现简单的字母移位(凯撒密码)
echo "hello" | tr 'a-z' 'defghijklmnopqrstuvwxyzabc'
# 输出 khoor

处理Windows文本文件 :Windows换行符是\r\n,Unix是\n,转换方法

bash 复制代码
tr -d '\r' < windows.txt > unix.txt  # 删除回车符
# 或
tr '\r' '\n' < windows.txt > unix.txt  # 将回车符转换为换行符

生成序列或随机字符串

bash 复制代码
# 生成随机小写字母串
cat /dev/urandom | tr -dc 'a-z' | head -c 10

⚠️ 重要注意事项

  • 字符串与字符tr 只能处理字符 ,不能将"hello"作为一个整体字符串替换为"hi"。这类操作需使用 sedawk

  • 集合对应关系 :替换时,如果字符集2比字符集1 ,字符集2的最后一个字符会被重复使用以匹配长度(除非用-t截断)。最好保持两者等长。

  • 原地修改文件tr 默认不直接修改文件。如需"原地修改",通常需要借助临时文件或 sponge 命令(需安装):

bash 复制代码
cat file.txt | tr 'a-z' 'A-Z' | sponge file.txt

tr 在简单、快速的字符流处理上无可替代。对于更复杂的模式匹配、字符串替换或行列操作,可以考虑 sedawkperl 等工具。

相关推荐
学不完的路路路2 小时前
IMX6ULL开发板固件烧录问题:添加设备树节点不成功
linux·ubuntu·设备树
大柏怎么被偷了2 小时前
【Linux】进程间通信
linux·运维·服务器
Howrun7772 小时前
Linux进程通信---6.1---进程信号屏蔽
linux·服务器
一颗青果2 小时前
五种IO模型
linux·服务器·网络
rocksun2 小时前
Neovim,会是你的下一款“真香”开发神器吗?
linux·python·go
郝学胜-神的一滴2 小时前
Linux线程属性设置分离技术详解
linux·服务器·数据结构·c++·程序人生·算法
知识分享小能手2 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的进程管理详解(15)
linux·学习·ubuntu
zfj3213 小时前
Linux内核和发行版的的区别、职责
linux·运维·服务器·内核·linux发行版
leoufung3 小时前
LeetCode 120. Triangle:从 0 分到 100 分的思考过程(含二维 DP 与空间优化)
linux·算法·leetcode