当前位置: 代码网 > 服务器>服务器>Linux > Linux中tr命令实现字符替换、压缩和删除的完整指南

Linux中tr命令实现字符替换、压缩和删除的完整指南

2026年08月18日 Linux 我要评论
快速参考:tr(translate)用于对标准输入的字符进行替换、压缩或删除操作。它是处理字符级文本变换的利器——大小写转换、删除控制字符、压缩连续空格、简单的加密解密,tr

快速参考tr(translate)用于对标准输入的字符进行替换、压缩或删除操作。它是处理字符级文本变换的利器——大小写转换、删除控制字符、压缩连续空格、简单的加密解密,tr 都能一行搞定。

简介

tr 从标准输入读取数据,按指定的字符集进行变换后输出到标准输出。它只能从标准输入读取,不能直接处理文件。

tr 是面向"字符"的工具,sed 是面向"行"的工具,awk 是面向"字段"的工具。

tr 属于 gnu coreutils 包,在所有 linux 发行版中预装。

语法

tr [选项] 集合1 [集合2]
  • 集合1:要被替换/删除的字符集
  • 集合2:替换为的字符集

选项

选项说明
-d / --delete删除集合1中的字符
-s / --squeeze-repeats压缩连续重复字符
-c / --complement取反(匹配集合1之外的字符)
-t / --truncate-set1截断集合1为集合2的长度

字符集表示

表示说明示例
'abc'字面字符tr 'abc' 'xyz'
'a-z'范围tr 'a-z' 'a-z'
'\n'转义字符tr '\n' ' '
[:alpha:]字母tr -d '[:digit:]'
[:digit:]数字tr -d '[:digit:]'
[:space:]空白字符tr -s '[:space:]'
[:punct:]标点符号tr -d '[:punct:]'
[:alnum:]字母和数字tr -dc '[:alnum:]'

示例

1. 大小写转换

# 转为小写
$ echo "hello world" | tr 'a-z' 'a-z'
hello world

# 转为大写
$ echo "hello world" | tr 'a-z' 'a-z'
hello world

# 使用字符类
$ echo "hello" | tr '[:upper:]' '[:lower:]'
hello

2. 删除字符(-d)

# 删除所有数字
$ echo "abc123def456" | tr -d '0-9'
abcdef

# 删除所有元音
$ echo "hello world" | tr -d 'aeiouaeiou'
hll wrld

# 删除换行符(合并为单行)
$ cat file.txt | tr -d '\n'

# 删除不可打印字符
$ tr -cd '[:print:]\n' < messy.txt > clean.txt

3. 压缩重复字符(-s)

# 压缩连续空格为单个空格
$ echo "hello    world" | tr -s ' '
hello world

# 压缩连续换行符(删除空行)
$ cat file.txt | tr -s '\n'

# 压缩所有空白字符
$ echo "hello   \t  world" | tr -s '[:space:]' ' '
hello world

4. 替换字符

# 将空格替换为换行(每行一个单词)
$ echo "one two three" | tr ' ' '\n'
one
two
three

# 将制表符替换为空格
$ cat file.tsv | tr '\t' ' '

# 将 windows 换行符替换为 unix 格式
$ tr -d '\r' < windows.txt > unix.txt

# 将逗号替换为制表符
$ echo "a,b,c" | tr ',' '\t'
a       b       c

5. rot13 加密/解密

# rot13:字母旋转13位,加密和解密用同一个命令
$ echo "hello world" | tr 'a-za-z' 'n-za-mn-za-m'
uryyb jbeyq

# 再执行一次解密
$ echo "uryyb jbeyq" | tr 'a-za-z' 'n-za-mn-za-m'
hello world

6. 取反操作(-c)

# 仅保留字母和数字(删除所有其他字符)
$ echo "hello! world@123" | tr -dc 'a-za-z0-9'
helloworld123

# 仅保留可打印字符
$ tr -dc '[:print:]\n' < binary_data > text_data

# 删除非数字字符
$ echo "phone: (010) 1234-5678" | tr -dc '0-9'
01012345678

7. 生成随机密码

# 生成16位随机密码(字母+数字)
$ head -c 100 /dev/urandom | tr -dc 'a-za-z0-9' | head -c 16
xk7mp2qr9vl3nb8j

# 生成更安全的密码(含特殊字符)
$ head -c 100 /dev/urandom | tr -dc 'a-za-z0-9!@#$%' | head -c 20

8. 配合cut处理多空格

# ls -l 输出中多空格问题
$ ls -l | tr -s ' ' | cut -d' ' -f5,9
# 先用 tr -s ' ' 压缩空格,再用 cut 截取

9. 字符统计

# 统计每个字符出现的次数
$ echo "hello" | fold -w1 | sort | uniq -c | sort -rn
      2 l
      1 o
      1 h
      1 e

10. 处理 csv 数据

# 删除 csv 中的引号
$ cat data.csv | tr -d '"'

# 将分号分隔改为逗号分隔
$ cat data.csv | tr ';' ','

场景示例

场景一:清洗数据

#!/bin/bash
# 清洗数据文件:去除不可打印字符、压缩空格、统一换行
input="$1"
output="$2"

tr -cd '[:print:]\n\t' < "$input" | \
    tr -s '[:space:]' ' ' | \
    tr '\r' '\n' > "$output"

echo "数据清洗完成"

场景二:格式转换

#!/bin/bash
# windows → unix 格式转换
for f in *.txt; do
    tr -d '\r' < "$f" > "${f}.unix"
    mv "${f}.unix" "$f"
done
echo "格式转换完成"

场景三:批量重命名

#!/bin/bash
# 将文件名中的空格替换为下划线
for f in *\ *; do
    new_name=$(echo "$f" | tr ' ' '_')
    mv "$f" "$new_name"
done

注意

  • tr 只能从标准输入读取,不能直接处理文件。用 tr ... < file 或管道。
  • tr 是字符级操作,不是字符串级操作。tr 'ab' 'xy' 会将所有 a 替换为 x,所有 b 替换为 y,不是将 ab 替换为 xy
  • tr 的集合1和集合2长度应相同。如果集合2更短,最后一个字符会被重复使用(除非加 -t)。
  • 需要字符串替换时用 sed,需要字符替换时用 tr

相关

命令用途
sed字符串替换(行级)
awk字段处理
cut字段截取
fold折叠行
iconv字符编码转换
dos2unixwindows/unix 换行符转换

总结

tr 是字符级文本变换的利器:

  1. tr 'a-z' 'a-z' 大小写转换
  2. tr -d 删除字符,tr -s 压缩重复
  3. tr -dc 取反删除(仅保留指定字符)
  4. 不能直接处理文件,需用管道或重定向
  5. 字符级操作用 tr,字符串级操作用 sed

常见问题

q1:trsed 有什么区别?

a:tr 是字符级操作,逐字符替换/删除。sed 是字符串级操作,可以替换整个字符串。例如 tr 'hello' 'hello' 会将所有 hhee 等,而 sed 's/hello/hello/' 会将 hello 作为一个整体替换。

q2:如何用 tr 将多个空格替换为单个?

a:

tr -s ' '
# -s(squeeze)压缩连续重复字符

q3:tr 能处理 unicode 字符吗?

a:有限支持。tr 主要针对单字节字符。多字节字符(如中文)可能无法正确处理。需要处理中文时,建议用 sed 或 python。

q4:如何删除文件中的所有换行符?

a:

tr -d '\n' < file.txt
# 或用 sed
sed ':a;n;$!ba;s/\n//g' file.txt

q5:tr-c 选项有什么用?

a:-c(complement)取反,匹配集合1之外的字符。常用于"仅保留某些字符":

# 仅保留数字
echo "abc123def" | tr -dc '0-9'
# 输出:123

q6:如何将制表符替换为空格?

a:

tr '\t' ' ' < file.tsv
# 或用 expand 命令(更灵活)
expand file.tsv

q7:tr 能处理正则表达式吗?

a:不能。tr 只支持字符集和范围(如 a-z),不支持正则表达式。需要正则用 sedgrep

q8:如何用 tr 实现字符串反转?

a:tr 不能做字符串反转。用 rev 命令:

echo "hello" | rev
olleh

以上就是linux中tr命令实现字符替换、压缩和删除的完整指南的详细内容,更多关于linux tr命令用法的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com