快速参考: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 是字符级文本变换的利器:
-
tr 'A-Z' 'a-z'大小写转换 -
tr -d删除字符,tr -s压缩重复 -
tr -dc取反删除(仅保留指定字符) - 不能直接处理文件,需用管道或重定向
-
字符级操作用
tr,字符串级操作用sed
常见问题
Q1:tr 和 sed 有什么区别?
A:tr 是字符级操作,逐字符替换/删除。sed 是字符串级操作,可以替换整个字符串。例如 tr 'hello' 'HELLO' 会将所有 h→H、e→E 等,而 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),不支持正则表达式。需要正则用 sed 或 grep。
Q8:如何用 tr 实现字符串反转?
A:tr 不能做字符串反转。用 rev 命令:
echo "hello" | rev olleh
以上就是Linux中tr命令实现字符替换、压缩和删除的完整指南的详细内容,更多关于Linux tr命令用法的资料请关注其它相关文章!













