行业资讯
📅 2026/8/3 20:17:50
脚本明明写对了,为什么就是匹配不到?\r\n 和 \n 的坑
一句话: Perl、Python、Shell 脚本在 Windows 上跑用\n匹配行尾总是失败——因为文件实际是\r\n。加上 Windows 大小写不敏感.c.C两个坑加起来能浪费一上午。适合谁读适合嵌入式开发者、单片机初学者及遇到类似问题的工程师坑 1\n 匹配不到 \r\n写了个 Perl 脚本批量替换文件内容s/old_function\n/new_function\n/g;在 Linux 上跑得好好的Windows 上永远匹配不到。原因Windows 文本文件行尾是\r\nCRLF不是\nLF。Perl 的\n只匹配 LF不匹配 CRLF。修法# 跨平台兼容写法 s/old_function\r?\n/new_function\r?\n/g; # 或者先统一行尾符 s/\r\n/\n/g; # 先全转成 LF s/old_function\n/new_function\n/g; # 再操作Python 同理# open 时指定 newline with open(file.c, r, newline) as f: content f.read() # 或者在正则里加 \r? import re re.sub(rold_function\r?\n, new_function\r?\n, content)一刀切的修法在 Windows 上用 Git Bash 跑脚本前统一行尾符# CRLF → LF sed -i s/\r$// *.c # 或者用 dos2unix dos2unix *.c # 跑完脚本再转回去 unix2dos *.c坑 2Windows 大小写不敏感列了文件清单发现少了drv_gpio.c。找了半天其实它就在目录里——只是文件名是Drv_Gpio.c。Windows 不区分大小写drv_gpio.cDRV_GPIO.cDrv_Gpio.c。你用ls *.c列出来的文件名和实际大小写可能不一致但 Windows 能访问。Git 区分大小写问题不明显。直到把文件拷到 Linux 上——编译直接报drv_gpio.c: No such file or directory。因为include里写的是drv_gpio.h实际文件是Drv_Gpio.h。怎么避免# 检查哪些 include 大小写不一致 grep -r #include *.c | while read line; do file$(echo $line | grep -o [^]* | tr -d ) if [ ! -f $file ]; then echo NOT FOUND: $file (in $line) fi done或者一开始就定规范所有文件名全小写。.c.h后缀必须小写前缀drv_app_mod_bsp_全小写。总结坑原因修法\n匹配不到Windows 用\r\n用\r?\n或先dos2unix文件找不到Windows 不区分大小写全小写命名规范Linux 上报错Git 区分大小写git mv改文件名别用 Windows 资源管理器有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。下一篇改了5个地方才修好——编译错误、看门狗、DAC踩坑、协议对齐——真实Bug故事排查方法论