判断文件行记录符是回车换行还是换行

本文遵循BY-SA版权协议,转载请附上原文出处链接。


本文作者: 黑伴白

本文链接: http://heibanbai.com.cn/posts/62fc3a8f/

判断文件行记录符是回车换行还是换行

通过shell脚本自动判断文件每一行的末尾记录符是回车换行(\r\n)还是换行(\n),主要是在处理数据文件时要进行区分判断

我们通过shell脚本命令进行自动区分判断

Shell源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash

# 功能:检测文件第一行的换行符类型(CRLF/\r\n / LF/\n / CR/\r)
# 用法:./detect_line_ending.sh <文件路径>
detect_line_ending() {
# 1. 校验参数数量
if [ $# -ne 1 ]; then
echo "ERROR: 参数错误!用法:$0 <文件路径>"
exit 1
fi
file_path="$1"

# 2. 校验文件状态(普通文件 + 非空)
if [ ! -f "$file_path" ]; then
echo "ERROR: 路径 $file_path 不是普通文件(可能是目录/链接/设备文件)!"
exit 1
fi
if [ ! -s "$file_path" ]; then
echo "ERROR: 文件 $file_path 是空文件(大小为0字节)!"
exit 1
fi

# 3. 核心逻辑:读取第一行 → 转纯十六进制 → 提取行尾字节
full_hex=$(head -n 1 "$file_path" | xxd -p | tr -d ' ')
hex_len=${#full_hex}

# 提取行尾1-2个字节(1字节=2位十六进制)
if [ $hex_len -ge 4 ]; then
last_two_bytes=${full_hex: -4} # 最后2个字节(对应\r\n)
last_one_byte=${full_hex: -2} # 最后1个字节
elif [ $hex_len -ge 2 ]; then
last_two_bytes=""
last_one_byte=${full_hex: -2}
else
echo "ERROR: 第一行无有效内容!"
exit 1
fi

# 4. 判断换行符类型
if [ "$last_two_bytes" = "0d0a" ]; then
result="CRLF"
symbol="\\r\\n"
elif [ "$last_one_byte" = "0a" ]; then
result="LF"
symbol="\\n"
elif [ "$last_one_byte" = "0d" ]; then
result="CR"
symbol="\\r"
else
result="UNKNOWN"
symbol="未知"
fi

# 5. 输出结果
echo "文件 $file_path 检测结果:"
echo "换行符类型:$result"
echo "对应符号:$symbol"
}

# 执行主函数
detect_line_ending "$1"

xxd和od的用法以及区别

本文中是使用的xxd转的十六进制, 另外也可以使用od进行进行转换, 这两者有什么区别?

xxdod 核心对比(Linux 二进制解析工具)

xxdod 都是 Linux 中用于查看文件/输入的二进制/字节内容的工具,但设计初衷、默认行为、使用场景差异极大,我用「对比+实例」的方式讲清二者的用法和区别,方便你记忆:

维度 xxd(Hex Dump) od(Octal Dump)
设计初衷 专为「十六进制解析」设计,轻量、易用,偏向文本/小文件 通用「进制转储」工具,默认八进制,适配二进制/大文件/设备文件
默认输出 十六进制 + 地址偏移 + 字符注释(人性化) 八进制 + 地址偏移(偏底层,可读性差)
核心优势 1. 纯十六进制输出(-p)适配文本解析;
2. 支持反向转换(十六进制→二进制);
3. 输出格式简洁,适合日常文本/换行符检测
1. 支持多进制(八/十/十六/二进制);
2. 适配大文件/设备文件(/dev);
3. 系统内置,兼容性极强(所有 Linux 发行版)
常用场景 文本文件解析(如换行符 \r\n 检测)、十六进制↔文本互转、小文件二进制查看 底层二进制分析、设备文件读取、多进制格式输出、大文件字节统计

xxd 核心用法(重点:文本/十六进制解析)

1. 基础用法(默认格式)

1
2
3
4
5
6
7
8
# 查看文件的十六进制+地址+字符注释
xxd test.txt
# 输出示例(test.txt 内容:hello\r\n):
0000000: 6865 6c6c 6f0d 0a hello..
# 解读:
# 0000000 → 地址偏移(字节);
# 6865 6c6c 6f0d 0a → 十六进制(每4位=2字节,空格分隔);
# hello.. → 字符注释(. 代表不可打印字符,如 \r\n)

2. 高频参数(日常最常用)

参数 作用 实例(对应上面的 test.txt)
-p 纯十六进制输出(无地址/空格/注释) xxd -p test.txt68656c6c6f0d0a
-c N 每行显示 N 个字节(默认16) xxd -c 2 test.txt → 每行2字节,如 6865/6c6c/6f0d/0a
-l N 只解析前 N 个字节 xxd -l 3 test.txt → 只显示前3字节:68656c
-r 反向转换(十六进制→二进制/文本) `echo “68656c6c6f”

3. 典型场景(我们之前的换行符检测)

1
2
3
# 提取第一行最后2个字节的十六进制(判断 \r\n)
head -1 test.txt | xxd -p | tr -d ' ' | rev | cut -c 1-4 | rev
# 输出:0d0a(对应 \r\n)

od 核心用法(重点:多进制/底层解析)

1. 基础用法(默认八进制)

1
2
3
4
5
6
7
8
9
# 查看文件的八进制+地址偏移
od test.txt
# 输出示例(test.txt 内容:hello\r\n):
0000000 065150 066154 000012
0000006
# 解读:
# 0000000 → 地址偏移(字节);
# 065150 → 八进制(对应 hex 6865);
# 000006 → 总字节数(6字节)

2. 高频参数(日常最常用)

参数 作用 实例(对应上面的 test.txt)
-An 不显示地址偏移 od -An test.txt065150 066154 000012
-t x1 输出十六进制,每1字节一组(空格分隔) od -An -t x1 test.txt68 65 6c 6c 6f 0d 0a
-t c 输出字符(显示 \r\n 等转义符) od -An -t c test.txth e l l o \r \n
-N N 只解析前 N 个字节 od -An -t x1 -N 3 test.txt68 65 6c

3. 典型场景(底层二进制分析)

1
2
3
# 检测设备文件的字节特征(如 /dev/urandom 随机字节)
od -An -t x1 -N 8 /dev/urandom
# 输出:随机8个字节的十六进制,如 `f3 4a 7b 9c 08 1d 7e 29`

核心区别总结(快速记忆)

  1. 使用门槛
    • xxd:新手友好,默认输出易读,-p 参数适配文本解析(如换行符检测);
    • od:偏底层,默认八进制可读性差,需手动指定 -t x1 转十六进制。
  2. 功能侧重
    • xxd:主打「十六进制↔文本互转」,适合日常文本文件的二进制解析;
    • od:主打「多进制转储」,适合底层二进制/设备文件/大文件分析。
  3. 反向转换
    • xxd -r 支持「十六进制→二进制/文本」(如恢复文件);
    • od 无反向转换功能,仅能「读」不能「写」。

选型建议(什么时候用哪个)

  • 文本文件解析(如检测换行符 \r\n、查看字符串的十六进制)→ 优先用 xxd-p 参数太香);
  • 底层二进制分析(如设备文件、大文件、多进制输出)→ 用 od
  • 反向转换(十六进制转文本/二进制)→ 只能用 xxd -r
  • 追求极致兼容性(老旧 Linux 系统)→ od(部分极简系统可能没有 xxd,但一定有 od)。

总结

  1. xxd 是「文本友好型」十六进制工具,适合日常文本/小文件解析,我们的换行符检测脚本用它更简洁;
  2. od 是「通用型」进制转储工具,默认八进制,适配底层/大文件/设备文件,兼容性更强;
  3. 核心差异:xxd 侧重十六进制和文本互转,od 侧重多进制底层分析,无反向转换。

蚂蚁🐜再小也是肉🥩!


判断文件行记录符是回车换行还是换行
http://heibanbai.com.cn/posts/62fc3a8f/
作者
黑伴白
发布于
2026年3月13日
许可协议

“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付