tr 字符转换

tr 是 translate 的缩写,用于字符转换、删除和压缩。它从标准输入读取数据,处理后输出到标准输出。虽然功能相对简单,但在字符处理场景中非常实用。

基本语法

tr [选项] 字符集1 字符集2
tr [选项] 字符集

字符集1 中的字符会被替换为字符集2 中对应的字符。

字符替换

将一个字符替换为另一个字符:

echo "hello" | tr 'a-z' 'A-Z'
echo "HELLO" | tr 'A-Z' 'a-z'

运行结果:

HELLO
hello

字符集可以用范围表示,如 a-z 表示所有小写字母,A-Z 表示所有大写字母。

替换特定字符

echo "192.168.1.1" | tr '.' '-'
echo "hello world" | tr ' ' '_'

运行结果:

192-168-1-1
hello_world

字符集

常用的字符集表示:

表示含义
a-z小写字母
A-Z大写字母
0-9数字
\n换行符
\t制表符

预定义字符类:

表示含义
[:alpha:]字母
[:digit:]数字
[:alnum:]字母和数字
[:space:]空白字符
[:punct:]标点符号
[:lower:]小写字母
[:upper:]大写字母
echo "Hello123World" | tr '[:upper:]' '[:lower:]'
echo "Hello World 123" | tr -d '[:digit:]'

删除字符

-d 选项删除指定字符:

echo "hello 123 world" | tr -d '0-9'
echo "hello 123 world" | tr -d ' '
echo "Hello, World!" | tr -d '[:punct:]'

运行结果:

hello  world
hello123world
Hello World

删除换行符

cat file.txt | tr -d '\n'
echo -e "a\nb\nc" | tr -d '\n'

把多行合并成一行。

压缩重复字符

-s 选项压缩连续重复的字符:

echo "hello    world" | tr -s ' '
echo "aaabbbccc" | tr -s 'a-z'

运行结果:

hello world
abc

压缩空行

cat file.txt | tr -s '\n'

把多个连续空行压缩成一个。

删除补集

-c 选项对字符集取补(取反):

echo "Hello123World" | tr -cd '0-9'
echo "Hello World" | tr -cd '[:alpha:]'

运行结果:

123
HelloWorld

-cd 删除不在指定字符集中的字符。

实用示例

大小写转换

echo "Hello World" | tr 'a-z' 'A-Z'
echo "Hello World" | tr 'A-Z' 'a-z'

删除所有数字

echo "Phone: 123-456-7890" | tr -d '0-9'

运行结果:

Phone: --

只保留数字

echo "Phone: 123-456-7890" | tr -cd '0-9'

运行结果:

1234567890

单词统计

cat document.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn

把空格替换成换行,每个单词一行,然后统计频率。

删除 Windows 换行符

Windows 文件的换行符是 \r\n,Linux 是 \n

tr -d '\r' < windows_file.txt > linux_file.txt

ROT13 加密

ROT13 是一种简单的字母替换加密:

echo "hello" | tr 'a-zA-Z' 'n-za-mN-ZA-M'

运行结果:

uryyb

再次执行可以解密。

生成随机密码

cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 16
echo

从 /dev/urandom 读取随机数据,只保留字母和数字,取前 16 个字符。

格式化 CSV

cat data.txt | tr -s ' ' ',' > data.csv

把多个空格压缩成一个,再替换成逗号。

tr 的局限性

tr 只能进行单字符对单字符的转换,不能:

  • 用字符串替换字符串
  • 用正则表达式匹配
  • 进行复杂的文本处理

这些需求需要用 sed 或 awk。

小结

  • tr 用于字符转换、删除和压缩
  • tr 'a-z' 'A-Z' 大小写转换
  • -d 删除字符,-s 压缩重复字符
  • -c 取补集,-cd 删除不在集合中的字符
  • 支持预定义字符类如 [:alpha:][:digit:]
  • 适合简单的字符处理,复杂操作用 sed 或 awk