一文搞清UNIXLinux与Windows文件换行符格式差异

当一个文件在 windows 和 linux 上交替操作后,经常遇到一些莫名其妙的问题,如 shell 脚本无法执行,找不到 shell 脚本等问题,本文谨就这一问题做一总结,供各位参考;
格式差异
换行符是行尾 (eol),是一个特殊的字符或字符序列,表示一行文本的结尾和新行的开头;
表示换行符的实际代码因操作系统而异:-- microsoft windows,dos(ms-dos,pc dos 等)使用 cr + lf;-- unix 和类 unix 系统使用,包括 linux,os x,freebsd 等使用 lf;-- mac 系统里,使用 cr;
cr 即 ascii 码的 0x0d( ),lf 为 ascii 码的 0x0a( ),dos 下使用( ),类 unix 系统下使用( ),dos 系统下的' '在类 unix 系统下会被显示为 ^m。
后文仅以 test-dos.sh 文件为例来说明,具体内容如下:
#!/bin/bashecho hello world !  
格式影响
直观影响
unix/mac 系统下的文件在 windows 里打开的话,所有文字会变成一行(由于 windows 下编辑器的处理,这种情况一般不会发生);
而 windows 里的文件在 unix/mac 下打开的话,在每行的结尾可能会多出一个 ^m 符号;
功能影响
在 windows 上编写的 shell、python 等脚本在 linux 上⽆法正常的执⾏,会有 ^m 相关提⽰:
[qxhgd@localhost crlf]$ ./test-dos.sh-bash: ./test.sh: /bin/bash^m: bad interpreter: no such file or directory  
如果在 make 编译的时候,执行 mksh(一个 shell 文件)可能会有类似下面的提示:
make[3]: ./mksh: command not found  
格式查看
windows 下查看
利用编辑器,如 visual studio code、ultraedit、notepad2 等软件,如在状态栏显示为 cr+lf 则为 windows 格式,如果显示为 lf 则为 linux 格式:
利用支持扩展搜索的编辑器,如 notepad++,查找 r :
linux 下查看
cat 命令 显示 ^m:
[qxhgd@localhost crlf]$ cat -v test-dos.sh#!/bin/bash^mecho hello world !^m  
显示 tab:
[qxhgd@localhost crlf]$ cat -t test-dos.sh#!/bin/bash^iecho hello world !  
od 命令 od 可以单独使用:
[qxhgd@localhost crlf]$ od -c test-dos.sh0000000   #   !   /   b   i   n   /   b   a   s   h       e   c   h0000020   o          h   e   l   l   o       w   o   r   l   d       !0000040   0000041  
也可以和 cat 配合使用:
cat test-dos.sh| od -c  
hexdump 命令
[qxhgd@localhost crlf]$ hexdump -c test-dos.sh0000000   #   !   /   b   i   n   /   b   a   s   h       e   c   h0000010   o          h   e   l   l   o       w   o   r   l   d       !0000020   0000021  
vim
状态栏下会显示:
test-dos.sh [noeol][dos] 2l, 33b
命令模式下执行 set ff:
fileformat=dos  
gedit
-- 首先使用 gedit 打开文件:
[qxhgd@localhost crlf]$ gedit test-dos.sh  
-- 搜索 r ,如果搜索到了就表示是 dos 格式:
格式修改
windows 下
可以利用编辑器修改,如 visual studio code,点击状态栏右下方的 crlf,选择 “行尾序列” 可修改为 lf 的格式;
有的编辑器,如 notepad2,有 line endings 可供选择:
利用支持扩展搜索的编辑器,如 notepad++,可将 r 替换掉:
linux 下
利用特殊工具转换
vim vim 命令模式下,执行 set ff=unix 或 set fileformat=unix 即可将 dos 格式转换为 unix 格式;
dos2unix 需要额外用命令安装,一般的 linux 系统不带的;unix2dos 与 dos2unix 作用正相反。
[qxhgd@localhost crlf]$ dos2unix test-dos.shdos2unix: converting file test-dos.sh to unix format ...[qxhgd@localhost crlf]$ dos2unix -n test-dos.sh test-unix.shdos2unix: converting file test-dos.sh to file test-unix.sh in unix format ...  
tofrodos 这一组一共两个命令,todos 和 fromdos,fromdos 用来将 dos 转换成 unix 格式,todos 是用于将 unix 转换成 dos 格式的,使用例子如下:
[qxhgd@localhost crlf]$ fromdos test-dos.sh  
利用文本处理工具
sed
-- 转换一个文件:
sed ‘s/^m//’ test-dos.sh> test-unix.sh  
-- 转换多个文件:
find ./ -type f print0 | xargs -0 sed -i 's/^m$//'  
vi
--  1、vi test-dos.sh --  2、:%s/^m//g 或:%s/ //g
-- 3、esc 退出 :wq 保存退出
其中 ^m 必须是同时按 ctrl+v+m(按住 ctrl 键,然后依次 v、m 键) 或依次按 ctrl + v 然后 ctrl + m,表示回车。
tr
tr -d �15 test-dos.sh                  cat test-dos.sh|tr -d ‘/r' > test-unix.sh tr -d ''  test-unix.sh  
perl
cat test-dos.sh | perl -pe ‘~s///g’ > test-unix.shperl -p -e 's///g' test-dos.sh> test-unix.shperl -pi -e 's///g' test-dos.sh  


华为公司专家组一行莅临物通博联调研指导
第二届数博会 见证数字时代巅峰汇聚
DC-DC变换器的功率开关元件损耗及续流二极管损耗如何计算?
iOS10.3或在3月发布,iOS10.2越狱无望?
RMBS扩大面向数据中心和PC设备的DDR5内存接口芯片组合
一文搞清UNIXLinux与Windows文件换行符格式差异
京东汽车商城与欧拉品牌正式签署了合作协议
智能开关功能介绍
OPPO宣布全球首个5G手机微信视频通话成功打通
永铭固液混合电容器—HUD抬头显示器中的应用
过年要备一堆电池?Wii手柄充电感应底座
索尼Xperia Z5Premium、黑莓Priv、华为荣耀magic、小米MIX、三星S7 edge颜值绝对比苹果高的,美到爆
中正信息&令令开门联合打造深圳“孔雀计划”孵化基地——云里智能园智慧运营平台
智能是鸡肋?回顾智能白电的前世今生
中国传感器市场发展迅速 看未来发展三大方向
Buck基本原理及调制方式
为什么磁盘是从C开始分配的
PCB经典设计流程是怎样的
TKScope嵌入式仿真开发平台讲座
打肉搏战?3699元,华为荣耀Magic是否值得购买