快速参考tr(translate)用于对标准输入的字符进行替换、压缩或删除操作。它是处理字符级文本变换的利器——大小写转换、删除控制字符、压缩连续空格、简单的加密解密,tr 都能一行搞定。

简介

tr 从标准输入读取数据,按指定的字符集进行变换后输出到标准输出。它只能从标准输入读取,不能直接处理文件。

tr 是面向"字符"的工具,sed 是面向"行"的工具,awk 是面向"字段"的工具。

tr 属于 GNU coreutils 包,在所有 Linux 发行版中预装。

语法

tr [选项] 集合1 [集合2]
  • 集合1:要被替换/删除的字符集
  • 集合2:替换为的字符集

选项

选项 说明
-d / --delete 删除集合1中的字符
-s / --squeeze-repeats 压缩连续重复字符
-c / --complement 取反(匹配集合1之外的字符)
-t / --truncate-set1 截断集合1为集合2的长度

字符集表示

表示 说明 示例
'abc' 字面字符 tr 'abc' 'xyz'
'A-Z' 范围 tr 'A-Z' 'a-z'
'\n' 转义字符 tr '\n' ' '
[:alpha:] 字母 tr -d '[:digit:]'
[:digit:] 数字 tr -d '[:digit:]'
[:space:] 空白字符 tr -s '[:space:]'
[:punct:] 标点符号 tr -d '[:punct:]'
[:alnum:] 字母和数字 tr -dc '[:alnum:]'

示例

1. 大小写转换

# 转为小写
$ echo "Hello WORLD" | tr 'A-Z' 'a-z'
hello world

# 转为大写
$ echo "Hello world" | tr 'a-z' 'A-Z'
HELLO WORLD

# 使用字符类
$ echo "Hello" | tr '[:upper:]' '[:lower:]'
hello

2. 删除字符(-d)

# 删除所有数字
$ echo "abc123def456" | tr -d '0-9'
abcdef

# 删除所有元音
$ echo "Hello World" | tr -d 'aeiouAEIOU'
Hll Wrld

# 删除换行符(合并为单行)
$ cat file.txt | tr -d '\n'

# 删除不可打印字符
$ tr -cd '[:print:]\n' < messy.txt > clean.txt

3. 压缩重复字符(-s)

# 压缩连续空格为单个空格
$ echo "hello    world" | tr -s ' '
hello world

# 压缩连续换行符(删除空行)
$ cat file.txt | tr -s '\n'

# 压缩所有空白字符
$ echo "hello   \t  world" | tr -s '[:space:]' ' '
hello world

4. 替换字符

# 将空格替换为换行(每行一个单词)
$ echo "one two three" | tr ' ' '\n'
one
two
three

# 将制表符替换为空格
$ cat file.tsv | tr '\t' ' '

# 将 Windows 换行符替换为 Unix 格式
$ tr -d '\r' < windows.txt > unix.txt

# 将逗号替换为制表符
$ echo "a,b,c" | tr ',' '\t'
a       b       c

5. ROT13 加密/解密

# ROT13:字母旋转13位,加密和解密用同一个命令
$ echo "Hello World" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Uryyb Jbeyq

# 再执行一次解密
$ echo "Uryyb Jbeyq" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Hello World

6. 取反操作(-c)

# 仅保留字母和数字(删除所有其他字符)
$ echo "Hello! World@123" | tr -dc 'a-zA-Z0-9'
HelloWorld123

# 仅保留可打印字符
$ tr -dc '[:print:]\n' < binary_data > text_data

# 删除非数字字符
$ echo "Phone: (010) 1234-5678" | tr -dc '0-9'
01012345678

7. 生成随机密码

# 生成16位随机密码(字母+数字)
$ head -c 100 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 16
xK7mP2qR9vL3nB8j

# 生成更安全的密码(含特殊字符)
$ head -c 100 /dev/urandom | tr -dc 'a-zA-Z0-9!@#$%' | head -c 20

8. 配合cut处理多空格

# ls -l 输出中多空格问题
$ ls -l | tr -s ' ' | cut -d' ' -f5,9
# 先用 tr -s ' ' 压缩空格,再用 cut 截取

9. 字符统计

# 统计每个字符出现的次数
$ echo "hello" | fold -w1 | sort | uniq -c | sort -rn
      2 l
      1 o
      1 h
      1 e

10. 处理 CSV 数据

# 删除 CSV 中的引号
$ cat data.csv | tr -d '"'

# 将分号分隔改为逗号分隔
$ cat data.csv | tr ';' ','

场景示例

场景一:清洗数据

#!/bin/bash
# 清洗数据文件:去除不可打印字符、压缩空格、统一换行
INPUT="$1"
OUTPUT="$2"

tr -cd '[:print:]\n\t' < "$INPUT" | \
    tr -s '[:space:]' ' ' | \
    tr '\r' '\n' > "$OUTPUT"

echo "数据清洗完成"

场景二:格式转换

#!/bin/bash
# Windows → Unix 格式转换
for f in *.txt; do
    tr -d '\r' < "$f" > "${f}.unix"
    mv "${f}.unix" "$f"
done
echo "格式转换完成"

场景三:批量重命名

#!/bin/bash
# 将文件名中的空格替换为下划线
for f in *\ *; do
    new_name=$(echo "$f" | tr ' ' '_')
    mv "$f" "$new_name"
done

注意

  • tr 只能从标准输入读取,不能直接处理文件。用 tr ... < file 或管道。
  • tr 是字符级操作,不是字符串级操作。tr 'ab' 'xy' 会将所有 a 替换为 x,所有 b 替换为 y,不是将 ab 替换为 xy
  • tr 的集合1和集合2长度应相同。如果集合2更短,最后一个字符会被重复使用(除非加 -t)。
  • 需要字符串替换时用 sed,需要字符替换时用 tr

相关

命令 用途
sed 字符串替换(行级)
awk 字段处理
cut 字段截取
fold 折叠行
iconv 字符编码转换
dos2unix Windows/Unix 换行符转换

总结

tr 是字符级文本变换的利器:

  1. tr 'A-Z' 'a-z' 大小写转换
  2. tr -d 删除字符,tr -s 压缩重复
  3. tr -dc 取反删除(仅保留指定字符)
  4. 不能直接处理文件,需用管道或重定向
  5. 字符级操作用 tr,字符串级操作用 sed

常见问题

Q1:trsed 有什么区别?

A:tr 是字符级操作,逐字符替换/删除。sed 是字符串级操作,可以替换整个字符串。例如 tr 'hello' 'HELLO' 会将所有 hHeE 等,而 sed 's/hello/HELLO/' 会将 hello 作为一个整体替换。

Q2:如何用 tr 将多个空格替换为单个?

A:

tr -s ' '
# -s(squeeze)压缩连续重复字符

Q3:tr 能处理 Unicode 字符吗?

A:有限支持。tr 主要针对单字节字符。多字节字符(如中文)可能无法正确处理。需要处理中文时,建议用 sed 或 Python。

Q4:如何删除文件中的所有换行符?

A:

tr -d '\n' < file.txt
# 或用 sed
sed ':a;N;$!ba;s/\n//g' file.txt

Q5:tr-c 选项有什么用?

A:-c(complement)取反,匹配集合1之外的字符。常用于"仅保留某些字符":

# 仅保留数字
echo "abc123def" | tr -dc '0-9'
# 输出:123

Q6:如何将制表符替换为空格?

A:

tr '\t' ' ' < file.tsv
# 或用 expand 命令(更灵活)
expand file.tsv

Q7:tr 能处理正则表达式吗?

A:不能。tr 只支持字符集和范围(如 A-Z),不支持正则表达式。需要正则用 sedgrep

Q8:如何用 tr 实现字符串反转?

A:tr 不能做字符串反转。用 rev 命令:

echo "hello" | rev
olleh

以上就是Linux中tr命令实现字符替换、压缩和删除的完整指南的详细内容,更多关于Linux tr命令用法的资料请关注其它相关文章!

觉得上面的内容有用吗?快来点个赞吧!

点赞() 我要打赏

温馨提示 : 本站内容来自会员投稿以及互联网,所有源码及教程均为作者总结编辑,请大家在使用过程中提前做好备份,以免发生无法预知的错误,源码类教程请勿直接用于生产环境!

 可能感兴趣的文章