0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux与Windows文件换行符的区别

xCb1_yikoulinux 来源:CSDN技术社区 作者:花神庙码农 2022-06-27 15:18 次阅读
  • 当一个文件在Windows和Linux上交替操作后,经常遇到一些莫名其妙的问题,如shell脚本无法执行,找不到shell脚本等问题,本文谨就这一问题做一总结,供各位参考;
  • 本文作者: 花神庙码农
  • 博客地址,https://blog.csdn.net/qxhgd。

格式差异

  • 换行符是行尾 (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/bash
echo"HelloWorld!"

格式影响

直观影响

  • Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行(由于Windows下编辑器的处理,这种情况一般不会发生);
  • 而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号;

功能影响

  • 在windows上编写的shell、python等脚本在Linux上⽆法正常的执⾏,会有 ^M 相关提⽰:
[qxhgd@localhostcrlf]$./test-dos.sh
-bash:./test.sh:/bin/bash^M:badinterpreter:Nosuchfileordirectory
  • 如果在make编译的时候,执行mksh(一个shell文件)可能会有类似下面的提示:
make[3]:./mksh:Commandnotfound

格式查看

Windows下查看

  • 利用编辑器,如Visual Studio Code、UltraEdit、Notepad2等软件,如在状态栏显示为CR+LF则为Windows格式,如果显示为LF则为Linux格式:3281657a-f399-11ec-ba43-dac502259ad0.png328bd0fa-f399-11ec-ba43-dac502259ad0.png
  • 利用支持扩展搜索的编辑器,如Notepad++,查找 :32954cb6-f399-11ec-ba43-dac502259ad0.png

Linux下查看

  • cat命令显示^M:
[qxhgd@localhostcrlf]$cat-vtest-dos.sh
#!/bin/bash^M
echo"HelloWorld!"^M

显示Tab:

[qxhgd@localhostcrlf]$cat-Ttest-dos.sh
#!/bin/bash
^Iecho"HelloWorld!"
  • od命令od可以单独使用:
[qxhgd@localhostcrlf]$od-ctest-dos.sh
0000000#!/bin/bash

ech
0000020o"HelloWorld!
0000040"
0000041

也可以和cat配合使用:

cattest-dos.sh|od-c
  • hexdump命令
[qxhgd@localhostcrlf]$hexdump-ctest-dos.sh
0000000#!/bin/bash

ech
0000010o"HelloWorld!
0000020"
0000021
  • vim

状态栏下会显示:

"test-dos.sh" [noeol][dos] 2L, 33B

命令模式下执行set ff:

fileformat=dos
  • gedit

-- 首先使用gedit打开文件:

[qxhgd@localhostcrlf]$gedittest-dos.sh

-- 搜索 ,如果搜索到了就表示是DOS格式:32a28c96-f399-11ec-ba43-dac502259ad0.png

格式修改

Windows下

  • 可以利用编辑器修改,如Visual Studio Code,点击状态栏右下方的CRLF,选择“行尾序列”可修改为LF的格式;

  • 有的编辑器,如Notepad2,有Line Endings可供选择:32b0a4f2-f399-11ec-ba43-dac502259ad0.png

  • 利用支持扩展搜索的编辑器,如Notepad++,可将 替换掉:32bf8800-f399-11ec-ba43-dac502259ad0.png

Linux下

利用特殊工具转换

  • vimvim命令模式下,执行set ff=unix或set fileformat=unix即可将DOS格式转换为unix格式;
  • dos2unix需要额外用命令安装,一般的Linux系统不带的;unix2dos与dos2unix作用正相反。
[qxhgd@localhostcrlf]$dos2unixtest-dos.sh
dos2unix:convertingfiletest-dos.shtoUnixformat...
[qxhgd@localhostcrlf]$dos2unix-ntest-dos.shtest-unix.sh
dos2unix:convertingfiletest-dos.shtofiletest-unix.shinUnixformat...
  • tofrodos这一组一共两个命令,todos和fromdos,fromdos用来将dos转换成unix格式,todos是用于将unix转换成dos格式的,使用例子如下:
[qxhgd@localhostcrlf]$fromdostest-dos.sh

利用文本处理工具

  • sed

-- 转换一个文件:

sed‘s/^M//’test-dos.sh>test-unix.sh

-- 转换多个文件:

find./-typefprint0|xargs-0sed-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
cattest-dos.sh|tr-d‘/r'>test-unix.sh
tr-d'
'< test-dos.sh >test-unix.sh
  • perl
cattest-dos.sh|perl-pe‘~s/
//g’>test-unix.sh
perl-p-e's/
//g'test-dos.sh>test-unix.sh
perl-pi-e's/
/
/g'test-dos.sh

原文标题:一文搞清UNIX/Linux与Windows文件换行符格式差异

文章出处:【微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208879
  • WINDOWS
    +关注

    关注

    3

    文章

    3524

    浏览量

    88399
  • 格式
    +关注

    关注

    0

    文章

    23

    浏览量

    16864
  • UNIX
    +关注

    关注

    0

    文章

    296

    浏览量

    41413

原文标题:一文搞清UNIX/Linux与Windows文件换行符格式差异

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    当一个文件WindowsLinux 上交替操作后,经常遇到一些莫名其妙的问题,如 shell 脚本无法执行,找不到 shell 脚本等问题,本文谨就这一问题做一总结,供各位参考;
    发表于 11-28 11:31 1483次阅读

    esp32貌似会对换行符(n,0x0a)进行替换,为什么?

    esp32貌似会对换行符(n,0x0a)进行替换。比如我用fwrite发送数据: const char data[] = {0x0a};fwrite(data, 1, sizeof(data
    发表于 06-26 07:36

    一个简单却不能忽视的换行符问题

    如图问题:请问第15行的换行符起什么作用?为什么有它没有它结果差别那么大?
    发表于 01-20 12:35

    labview 如何处理Return键按下在输入框有换行符存在?

    户名和密码输入框还有换行符在,这样帐号密码就check不正确了,我的处理方法是把换行符都替换成空字符串,但是感觉在输入框有换行符在很别扭,请问labview有没用像C#一样有e.handled=ture这样的类似用法不处理该按键
    发表于 07-04 22:58

    字符串中回车换行符的长度问题

    各位大神,我发现我的字符串控件中,输入回车换行符时,长度只有一个字节,而不是两个字节,然后我将我输入的回车换行符通过串口发送出去,串口调试助手那边收到的并不实现换行功能。请问各位大神,这个该怎么搞?是不是字符串控件哪里需要设置一
    发表于 05-12 12:07

    Labview怎么删除数组元素内的换行符,请各位大神分享。谢谢了!

    Labview怎么删除数组元素内的换行符,已经搞定了,谢谢!
    发表于 01-21 11:00

    MINI板使用WIFI模块例程发现回车换行符不见了

    1.使用WIFI模块的例程,在发送测试数据给电脑上的网络调试助手,总是会有 0D 0A这样的换行命令出现,后来注释了LCD的显示函数Show_Str(),发现回车换行符不见了,而且是有一个
    发表于 02-13 00:53

    linux文件的fgets与gets操作

    从标准输入里读取字符串。从标准输入里读出字符串并将其存储在字符数组str里,直到遇到换行符"\n"或者文件终止EOF如果遇到换行符"\n",从标准输入到字符数组str的复制操作终止。
    发表于 07-11 08:39

    这段代码意思是不是当换行符输入时循环跳过?

    大家好,我想问大家while (getchar()!='\n') continue;这段代码意思是不是当换行符输入时循环跳过啊
    发表于 05-22 12:45

    Labview串口时候数据中的0x0A与换行符冲突怎么解决?

    串口数据传输时候,含有0x0A与换行符冲突,如果关闭终止,那样就无法识别串口数据结束,无法识别换行了,请问下大家如何解决?
    发表于 12-06 21:33

    请问一下Java中平台无关的换行符是什么?

    Java中平台无关的换行符是?
    发表于 06-01 11:33

    WCHISPTool对于Hex文件换行符支持哪几种?

    我这边需要使用代码修改模版HEX文件里的数据,以生成不同版本,不同配置的HEX文件。但是工具就回报”错误的文件#3“。搞了好几个小时才发现,WCHISPTool只支持windows
    发表于 08-22 07:10

    从git拉取代码到Windows系统中出错的原因及其解决办法

    换行符Windows 一直使用的 CRLF(即,回车 CR和换行 LF)作为换行符。将 Windows 系统下的
    发表于 09-29 12:01

    Linux文件文件描述概述

    6.2 Linux文件文件描述概述 在Linux中对目录和设备的操作都等同于文件的操作,因
    发表于 10-18 14:35 0次下载

    python输出换行符\n怎么用

    在Python中,要输出换行符"n",可以使用print函数。print函数可以接受多个参数,并将它们打印到控制台。 下面是一个使用print函数输出换行符的简单示例: print
    的头像 发表于 11-22 10:48 2089次阅读