rev只反转字节而非字符,对UTF-8中文或emoji会因破坏多字节结构而乱码;仅适用于纯ASCII文本,常用于行内字节级翻转,如日志分析、域名倒查等。

rev 只反转字节,不是字符
直接 echo "你好" | rev 很可能输出乱码或截断,因为 rev 不理解 UTF-8 编码结构——它把每个汉字当 3 个独立字节处理,然后整体倒序,破坏了多字节序列。这不是 bug,是设计如此。
- 纯 ASCII 字符串(英文、数字、常见标点)可安全使用:
echo "abc123" | rev→321cba - 含中文、emoji、带重音符号的字母(如 naïve)时,
rev行为不可靠 - 验证编码:用
file -i filename确认是否真为utf-8;若为iso-8859-1或其他单字节编码,rev反而能“正确”反转
反转文件每行内容(最常用且安全的场景)
rev 的核心价值在于按行字节翻转,不改变行序——这恰恰适合日志分析、域名倒查、base64 片段调试等任务。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 查看日志最新字段:比如 Apache 日志最后一段是响应码,
tail -n 20 access.log | rev | cut -d' ' -f1 | rev提取并还原响应码 - 原地替换需临时文件:
rev input.txt > tmp && mv tmp input.txt,rev本身无-i参数 - 跳过空行:
grep -v '^$' data.txt | rev,避免空行被当作单个换行符参与反转 - 配合
cut做路径局部反转:先rev整条路径,再cut -d'/' -f1取末段翻转结果,最后再rev一次还原,如echo "/var/log/nginx/error.log" | rev | cut -d'/' -f1 | rev→error.log
Bash 内置 ${var@R} 和 rev 的区别必须分清
脚本里想反转变量内容,别下意识调 rev 管道——${var@R} 是 Bash 4.2+ 原生语法,按 Unicode 字符反转,对中文友好;而 rev 是外部命令,依赖 locale 设置,行为不稳定。
- 测试差异:
var="aβγ"; echo "${var@R}"稳定输出γβa;但echo "$var" | rev在Clocale 下会字节错乱,在en_US.UTF-8下才可能碰巧一致 - 性能差异明显:
${var@R}零子进程开销;echo "$var" | rev启动新进程,小字符串也慢一拍 - 局限性:
${var@R}只能处理变量,不能接管道或大文件;遇到流式输入(如cat huge.log | rev),还是得靠rev
别把 rev 当通用字符串工具用
它不是 sed 或 awk 的替代品,也不该用于需要语义理解的反转(比如只翻单词、不翻标点)。它的定位很窄:行内字节级倒序。
- 想反转整个文件的行序?用
tac,不是rev - 想反转单词顺序("hello world" → "world hello")?用
awk '{for(i=NF;i>=1;i--) printf "%s%s", $i, (i>1?OFS:ORS)}' - 想安全反转任意 UTF-8 字符串?优先考虑
perl -C -nle 'print scalar reverse'或 Python 的print(input()[::-1]) - 调试时注意隐藏字符:
echo -e "a\tb" | rev输出b a(制表符也被反转),容易误判逻辑
rev 会把整行当字节流翻,结果必然错位。这种时候,要么拆开处理,要么换语言级工具。

















