tr 命令可转换大小写,但需用单引号避免通配符展开,推荐 posix 字符类 [:lower:] 和 [:upper:];不支持 unicode 多字节字符,中文等场景应换用 perl 或 iconv。

tr 命令能直接完成大小写转换,但必须注意字符集写法、Locale 影响和非 ASCII 字符的限制。
用 tr 'a-z' 'A-Z' 转小写为大写,但别漏掉单引号
不加引号会导致 shell 把 a-z 当作通配符展开(比如当前目录有文件名以 a 或 z 开头),命令直接报错或行为异常。正确写法是:
-
echo "Hello World" | tr 'a-z' 'A-Z'→ 输出HELLO WORLD -
tr 'a-z' 'A-Z' output.txt适用于文件批量处理 - 如果输入含空格或换行,
tr仍逐字符处理,不影响结果
优先用 [:lower:] 和 [:upper:] 字符类,更安全
相比 a-z,POSIX 字符类能适配不同语言环境下的字母定义(比如带重音符号的字符),且避免手动拼错范围。但要注意:
-
tr '[:lower:]' '[:upper:]'是标准写法,两边单引号不能省 - 在中文 locale(如
zh_CN.UTF-8)下,[:lower:]可能匹配不到非 ASCII 小写字母;此时建议临时切到 C locale:LC_ALL=C tr '[:lower:]' '[:upper:]' -
[:lower:]不包含数字或符号,只作用于字母字符
tr 无法处理 Unicode 多字节字符(比如中文、emoji)
它按字节操作,不是按字符。对 UTF-8 编码的中文文本执行 tr 'a-z' 'A-Z' 没效果,但可能意外破坏字节序列,导致乱码:
- 测试:运行
echo "你好" | LC_ALL=C tr 'a-z' 'A-Z',输出很可能变成乱码或截断 - 真正需要处理中文/日文/emoji 大小写的场景,应换用
perl -CS -pe 's/.+/uc($&)/e'或iconv配合其他工具 - 纯英文 + 数字 + ASCII 标点的文本,
tr仍是最快最轻量的选择
常见错误:把 -c 选项误用于大小写翻转
tr -c 'a-z' 'A-Z' 的意思是“把所有**非小写字母**的字符替换成 A-Z 中对应位置的字符”,这完全不是大小写转换,而是灾难性替换:
- 输入
hello123→ 输出可能是AAAABBB(取决于A-Z长度和补集映射逻辑) - 真正想做“大小写互换”(即大写变小写、小写变大写),
tr本身不支持单次完成;得用两次管道:tr 'a-zA-Z' 'A-Za-z'—— 注意两个集合长度必须一致,否则会截断 -
tr 'a-zA-Z' 'A-Za-z'是可行的,但可读性差,容易写错顺序;日常建议用awk '{print toupper($0)}'更直观
真正容易被忽略的是 Locale 设置——哪怕你写了正确的 [:lower:],在非 C locale 下也可能失效;而一旦涉及 UTF-8 多字节字符,tr 就该立刻让位给更合适的工具。











