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 文件的换行符是 \r\n,Linux 是 \n:
tr -d '\r' < windows_file.txt > linux_file.txt
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 个字符。
cat data.txt | tr -s ' ' ',' > data.csv
把多个空格压缩成一个,再替换成逗号。
tr 只能进行单字符对单字符的转换,不能:
这些需求需要用 sed 或 awk。
tr 'a-z' 'A-Z' 大小写转换-d 删除字符,-s 压缩重复字符-c 取补集,-cd 删除不在集合中的字符[:alpha:]、[:digit:]