rev命令反转字节序列而非字符编码,对UTF-8中文或emoji会因破坏多字节结构而乱码;仅适用于纯ASCII文本,常用作行内字节级翻转工具。

rev 命令到底反转什么,不是字符编码而是字节序列
rev 不按 Unicode 字符、不按中文词、不按单词边界反转,它只把输入当作一串字节,从末尾到开头逐字节倒序排列。这意味着含中文、emoji 或 UTF-8 多字节字符的字符串,直接用 rev 会“乱码”——比如 echo "你好" | rev 可能输出乱码或截断,因为 UTF-8 中每个汉字占 3 字节,rev 把这 6 个字节整体翻转,破坏了编码结构。
实操建议:
- 纯 ASCII 文本(英文、数字、标点)可放心用
rev,如反转域名、日志 ID、十六进制字符串 - 处理中文前先转为单字节编码(不推荐)或换工具(如
perl -C -nle 'print scalar reverse') - 确认输入是否真为 UTF-8:
file -i filename查看 charset,避免误判
反转文件每行内容,但不改变行序
这是 rev 最常用也最安全的场景:保持文件行数和换行位置不变,仅对每行内部做字节级翻转。适合处理倒序查看日志、提取反向域名、调试 base64 片段等。
实操建议:
- 直接管道:
cat access.log | rev,比sed或awk更轻量 - 原地替换需借助临时文件:
rev input.txt > tmp && mv tmp input.txt,rev本身不支持-i参数 - 想跳过空行?加
grep -v '^$'过滤:grep -v '^$' data.txt | rev
配合 cut、awk 实现“局部反转”,比如只翻转路径最后一段
rev 经常被当成“辅助切割工具”使用——先整体翻转,切出目标段,再翻回来。例如从 /var/log/nginx/error.log 中只反转文件名部分(error.log → gol.rorre),而不动目录结构。
实操建议:
- 分三步走:
echo "/var/log/nginx/error.log" | rev | cut -d'/' -f1 | rev - 注意
cut -d'/' -f1在第一次rev后实际取的是翻转路径的“第一段”,也就是原路径最后一段的翻转结果 - 如果路径以
/结尾(如/home/user/),cut -f1会得到空字段,建议先用sed 's|/$||'清理
rev 和 shell 参数扩展反转效果完全不同,别混用
Bash 4.2+ 支持 ${var@R} 语法实现变量内容反转,但它按 Unicode 字符而非字节处理,对中文友好;而 rev 是外部命令,依赖 locale 和输入编码。两者行为可能完全不一致。
实操建议:
- 测试差异:
var="aβγ"; echo "${var@R}"输出 γβa(字符级),echo "$var" | rev在 en_US.UTF-8 下也可能输出类似结果,但在 C locale 下会字节错乱 - 脚本中若需稳定反转字符串,优先用
${var@R}(仅限 Bash),而不是调用rev管道,减少子进程开销 - 但
${var@R}不能处理流式输入,遇到大文件或管道数据仍得靠rev
真正容易被忽略的是 locale 设置——LC_ALL=C rev 和 LC_ALL=en_US.UTF-8 rev 对同一中文文件的输出可能都不同,而文档几乎从不提这点。


















