tr
tr(来自单词 transform)是一个 Linux/Unix 命令行工具,用于对标准输入中的字符进行转换、删除或压缩,常与 cat、grep、sed、awk 等工具搭配使用。
tr [选项]... SET1 [SET2]选项:控制 tr 行为的选项SET1:待替换的字符集SET2:替换成的字符集
tr 不支持文件输入,必须通过标准输入传入数据
tr 的基础功能(不带任何选项)是进行字符替换(此时需要用到 SET2),删除、压缩功能需要使用对应的选项(此时不需要用到 SET2)。
替换规则
- SET1 和 SET2 按位置一一对应替换
- 若 SET1 长于 SET2,多余字符会被 SET2 的最后一个字符替换
tr只能处理单个字符,不能替换字符串或单词(多字符)
tr 中的字符包含以下几种:
1. 普通字符
直接输入字符即可,包括字母、数字、标点和空格。示例:'abc'、'123'、'!@#'
2. 字符范围
用 - 表示连续字符序列,格式为 起始字符-结束字符,仅适用于 ASCII 码连续的字符:
a-z:所有小写字母A-Z:所有大写字母0-9:所有数字a-cx-z:等价于abcxyz(多个范围组合)
范围必须是“从小到大”,如
z-a是无效的 若需表示-本身,需放在字符集开头或结尾,例如'-abc'或'abc-'
3. POSIX 字符类
写在 [:xxx:] 中的标准字符分类,可以替代具体字符范围,更可读、跨语言环境更可靠:
| POSIX 类名 | 含义 | 等价范围 |
|---|---|---|
[:alnum:] |
字母 + 数字 | a-zA-Z0-9 |
[:alpha:] |
所有字母 | a-zA-Z |
[:blank:] |
空格 + tab | " \t" |
[:cntrl:] |
控制字符 | ASCII 控制码 |
[:digit:] |
数字 | 0-9 |
[:lower:] |
小写字母 | a-z |
[:upper:] |
大写字母 | A-Z |
[:punct:] |
标点符号 | . , ; ! ? 等 |
[:space:] |
所有空白字符 | 空格、tab、换行等 |
[:xdigit:] |
十六进制字符 | 0-9A-Fa-f |
4. 转义字符
可以用反斜线 \ 转义特殊字符或表示控制字符:
| 写法 | 含义 |
|---|---|
\n |
换行 |
\t |
tab(制表符) |
\\ |
反斜线本身 |
| 选项 | 含义 |
|---|---|
-d |
删除文本中所有在 SET1 中的字符(不需要 SET2) |
-s |
替换连续重复字符为单个字符(squeeze,不需要 SET2) |
-c |
取 SET1 的补集(complement) |
--help |
查看帮助文档 |
--version |
查看版本信息 |
1. 替换小写字母为大写字母
echo "hello world" | tr 'a-z' 'A-Z'输出:
HELLO WORLD2. 替换数字为 #
echo "user1234" | tr '0-9' '#'输出:
user####3. 替换空格为下划线
echo "data science is fun" | tr ' ' '_'输出:
data_science_is_fun4. 替换多个字符为相同值(SET2 长度为 1)
echo "a b c d" | tr 'abcd' 'X'输出:
X X X X5. 替换换行符为逗号
printf "a\nb\nc\n" | tr '\n' ','输出:
a,b,c,6. 互换大小写
echo "Hello World" | tr 'a-zA-Z' 'A-Za-z'输出:
hELLO wORLD7. 删除文本中指定字符(-d)
echo "abc123xyz" | tr -d '0-9'输出:
abcxyz8. 将连续重复字符压缩成一个(-s)
echo "a b c" | tr -s ' '输出:
a b c9. 取补集 — 保留 SET1 中的字符,删除其余字符(-dc)
echo "Hello 123 World!" | tr -dc '[:alpha:]'输出:
HelloWorldman tr- GNU Coreutils - tr