如何快速将小写转大写?

tr(translate)是 Linux/Unix 中用于字符替换、删除或压缩的文本处理工具,它直接处理标准输入(stdin),输出到标准输出(stdout),是 Shell 脚本中高频使用的命令之一。


核心语法格式

tr [选项] SET1 [SET2]
  • SET1:要操作的原字符集
  • SET2:替换后的目标字符集(若未指定,则默认删除操作)
  • 重要特性tr 按字符(非单词)逐字处理文本。

常用选项速查

选项 作用
-d 删除 SET1 中的字符
-s 压缩连续重复字符(去重)
-c 对 SET1 的补集操作(即“非 SET1 的字符”)
-t 将 SET1 截断为与 SET2 等长(避免多字符替换)

高频使用场景详解

字符替换(基础)

# 输出:HELLO WORLD
# 替换特定字符(如空格变下划线)
echo "file name.txt" | tr ' ' '_'
# 输出:file_name.txt
# 加密:ROT13 算法(字母偏移13位)
echo "secret" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
# 输出:frperg

删除字符(-d

# 删除所有数字
echo "phone: 123-456" | tr -d '0-9'
# 输出:phone: -
# 删除换行符(合并多行为单行)
tr -d '\n' < input.txt
# 删除非数字字符(结合 `-c`)
echo "a1b2c3" | tr -cd '0-9'
# 输出:123

压缩重复字符(-s

# 压缩连续空格为单空格
echo "too    many spaces" | tr -s ' '
# 输出:too many spaces
# 压缩重复字母(如多个换行变一个)
echo -e "a\n\n\nb" | tr -s '\n'
# 输出:
# a
# b

字符集等价类(预定义字符组)

tr 支持 POSIX 字符类,简化常见匹配:

# 删除所有标点符号
echo "Hello! How are you?" | tr -d '[:punct:]'
# 输出:Hello How are you
# 常用等价类:
# [:alnum:] 字母+数字  [:digit:] 数字     [:lower:] 小写字母
# [:upper:] 大写字母   [:space:] 空白符   [:alpha:] 字母

进阶技巧

  • 保留换行符:用 \n 显式指定
    echo -e "a\nb\nc" | tr 'a-c' 'x-z'  # 替换字母但保留换行
  • 十六进制转义:用 \xNN 表示特殊字符
    echo "data" | tr 'a' '\x01'  # 将 'a' 替换为 ASCII 0x01

避坑指南

  1. 不支持正则表达式
    tr 仅处理单个字符,不支持 、 等正则元字符。
    错误示例tr 'abc' 'def' 不会替换字符串 “abc”,而是分别替换 a→d、b→e、c→f。

  2. 字符集长度需匹配
    SET1SET2 长,SET2 会重复最后一个字符补齐:

    echo "abc" | tr 'abcd' 'XYZ'  # a→X, b→Y, c→Z, d→Z
  3. 处理二进制文件需谨慎
    tr 可能破坏二进制数据(如图片、可执行文件),建议仅用于文本。


典型应用场景

  • 日志清洗:删除无关字符或压缩空格
  • 数据格式化:CSV 文件分隔符转换(如逗号转制表符)
  • 密码生成:结合 /dev/urandom 生成随机字符串
    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 12

tr 是 Linux 文本处理的“瑞士军刀”,以简洁高效著称,虽然功能单一(仅限字符级操作),但在管道命令组合中不可或缺,掌握其核心用法(替换、删除、压缩)和字符集规则,可大幅提升命令行文本处理效率。

引用说明参考 Linux man-pages (tr 1.0) 及 GNU Coreutils 文档,结合常见运维实践整理。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8192.html

(0)
酷番叔酷番叔
上一篇 2025年7月21日 08:05
下一篇 2025年7月21日 08:25

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信