快速参考: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命令用法的资料请关注代码网其它相关文章!
发表评论