首页 > 系统相关 >Linux与Windows文件换行符差异

Linux与Windows文件换行符差异

时间:2023-08-07 21:34:16浏览次数:40  
标签:Windows -- unix sh qxhgd Linux test dos 换行符

当一个文件在 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(\r),LF 为 ASCII 码的 0x0A(\n),DOS 下使用(\r\n),类 Unix 系统下使用(\n),DOS 系统下的'\r'在类 Unix 系统下会被显示为 ^M。

后文仅以 test-dos.sh 文件为例来说明,具体内容如下:

#!/bin/bash
echo "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 格式:
  • Linux与Windows文件换行符差异_换行符

    Linux与Windows文件换行符差异_Linux运维_02


  • 利用支持扩展搜索的编辑器,如 Notepad++,查找 \ r\n:
  • Linux与Windows文件换行符差异_换行符_03


Linux 下查看

  • cat 命令 显示 ^M:
[qxhgd@localhost crlf]$ cat -v test-dos.sh
#!/bin/bash^M
echo "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.sh
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   e   c   h
0000020   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.sh
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   e   c   h
0000010   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\n,如果搜索到了就表示是 DOS 格式:

Linux与Windows文件换行符差异_Linux运维_04

格式修改

Windows 下

  • 可以利用编辑器修改,如 Visual Studio Code,点击状态栏右下方的 CRLF,选择 “行尾序列” 可修改为 LF 的格式;
  • 有的编辑器,如 Notepad2,有 Line Endings 可供选择:
  • Linux与Windows文件换行符差异_Linux运维_05


  • 利用支持扩展搜索的编辑器,如 Notepad++,可将 \ r\n 替换掉:
  • Linux与Windows文件换行符差异_换行符_06


Linux 下

利用特殊工具转换

  • vim vim 命令模式下,执行 set ff=unix 或 set fileformat=unix 即可将 DOS 格式转换为 unix 格式;
  • dos2unix 需要额外用命令安装,一般的 Linux 系统不带的;unix2dos 与 dos2unix 作用正相反。
[qxhgd@localhost crlf]$ dos2unix test-dos.sh
dos2unix: converting file test-dos.sh to Unix format ...
[qxhgd@localhost crlf]$ dos2unix -n test-dos.sh test-unix.sh
dos2unix: 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/\r//g
-- 3、esc 退出 :wq 保存退出

其中 ^M 必须是同时按 Ctrl+V+M(按住 Ctrl 键,然后依次 V、M 键) 或依次按 Ctrl + V 然后 Ctrl + M,表示回车。

  • tr
tr -d "\015" test-dos.sh                  
cat test-dos.sh|tr -d ‘/r' > test-unix.sh 
tr -d '\r' < test-dos.sh > test-unix.sh
  • perl
cat test-dos.sh | perl -pe ‘~s/\r//g’ > test-unix.sh
perl -p -e 's/\r//g' test-dos.sh> test-unix.sh
perl -pi -e 's/\r\n/\n/g' test-dos.sh

标签:Windows,--,unix,sh,qxhgd,Linux,test,dos,换行符
From: https://blog.51cto.com/jowin/6998070

相关文章

  • linux 运行级别和启动脚本
    在Linux操作系统中,运行级别(Runlevel)是一个用于描述系统运行状态的概念,而启动脚本(StartupScript)则是用来控制系统在不同运行级别下启动和停止服务和守护进程的脚本。运行级别:运行级别定义了系统的不同工作状态,每个运行级别都对应着一组特定的服务和守护进程的启动状态。在传统......
  • linux 进程间通信和信号处理
    进程间通信(InterprocessCommunication,IPC)和信号处理是Linux系统中用于实现不同进程之间数据交换和协调的重要机制。以下是关于这两个概念的详细解释,并附带示例说明:进程间通信(IPC):管道(Pipe):管道是一种半双工通信方式,可用于在父子进程之间传递数据。一个进程将数据写入管道,另一......
  • Mir 2.14 正式发布,Ubuntu 使用的 Linux 显示服务器
    Canonical公司最近发布了Mir2.14,这是该项目的最新版本。Mir2.14在Wayland方面通过ext-session-lock-v1协议增加了对屏幕锁定器(screenlockers)的支持,并最终支持Wayland拖放。此外还整合了渲染平台的实现,放弃了之前在RaspberryPi设备上使用的DispmanX平......
  • Windows c++检测笔记本是否处于睡眠状态
    最近遇到一个问题,程序需要检测电脑是否处于睡眠状态。一开始使用的方式是在WindowProc里监听WM_POWERBROADCAST消息,对PBT_APMSUSPEND``PBT_APMRESUMEAUTOMATIC消息做处理。但是实际测试中发现,这种方法在台式机中运行良好,但是放到笔记本电脑里就不行,系统休眠时监听不到WM_POWERBRO......
  • 谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题
    1摘要内核和硬件等低级系统已被证明极难进行有效测试,因此,许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的,而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设,这些假设必须从根本上反映在框架的设计中。......
  • linux内网穿透应用场景有哪些?快解析有什么用处?
    随着网络技术的不断发展,无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案,为我们提供了无限可能。首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程......
  • 【Linux】sz命令下载tar.gz,zip等文件到Windows解压时提示文件已损坏
    WinRAR打开提示:不可预料的压缩文件末端 用Bandzip打开提示:文件已损坏 用7Zip打开虽然不报错,但是发现文件缺失。开始以为是网络问题导致下载文件不全,但是对比文件大小发现一模一样。通过查看sz命令说明,解决办法为:下载的时候需要加上-be参数,明确指定下载的是二进制文件。......
  • 【转载】Windows设置exe或者bat文件开机启动
    5种方式:启动路径方式任务计划程序方式组策略方式注册表方式创建Windows服务方式【具体参考】Windows设置exe或者bat文件开机启动的几种方法汇总(yii666.com)exe做成服务开机自启-一门EXE教程(yimenapp.com)......
  • Linux:防火墙iptables与firewalld的启停
    Linux关闭防火墙firewall和iptables命令_永久关闭iptables防火墙_红烧柯基的博客-CSDN博客Linux防火墙——iptables以及firewalld的使用介绍_树下一少年的博客-CSDN博客干货!Linux防火墙配置(iptables和firewalld)_数据包_规则_进行 iptables与firewalld1、状态syste......
  • linux循环语法错误笔记
     在freebsd上执行一个while循环,总是提示语法错误,查了许久资料,突然发现有人说到解释器问题,才焕然大悟,查看一下当前解释器:echo$SHELL果然,用的是csh,不是sh,也不是bash查看一下当前已安装解释器: cat/etc/shells那么就好说了,把命令写入脚本,然后用sh执行就行#!/bin/shwhile......