在 Windows 上,如何检测文件的行尾?

25

我看过了几篇答案,但是据我所知,这些答案并不是从Windows的角度来写的。

在文本文件中,Windows使用CR LF,Unix使用LF,Mac也使用LF,而经典的Mac则使用其他方式。如果一个文件使用与我正在输入的换行符不同的换行符,我就无法判断,因此在尝试运行脚本/程序时会出现错误,这些错误实际上并没有多大意义。将其转换后,脚本可以正常运行。

有没有办法在Windows上预先检查文件使用的换行符?


使用十六进制编辑器,寻找分别为 0x0D0x0A 的字符。它们以此顺序组成了Windows换行符。 - Ken White
6
如果你用记事本打开文件,那么很明显可以看出它是否有非Windows的行尾字符(因为记事本不将它们视为行尾符)。但这假设文件是一致的,如果只有几个不匹配的行尾序列,就可能不那么明显了。 - Harry Johnston
3
被低估的问题。 - Marinos An
请参见 https://dev59.com/umIj5IYBdhLWcg3wUjzG - charles ross
5个回答

8
步骤:

然后你就可以执行:

c:\gnuwin32\bin\file.exe my-lf-file.txt

my-lf-file.txt; ASCII text

c:\gnuwin32\bin\file.exe my-crlf-file.txt

my-crlf-file.txt; ASCII文本,带有CRLF行终止符

当然您可以将c:\gnuwin32\bin添加到%PATH%变量中,以便无需提供完整路径即可访问它。


更新:

  • 如果您已安装git,则可以启动git-bash并从那里运行file命令。

  • 或者您可以安装子系统,如官方Microsoft文档所述,然后获得对file命令的访问。


更新成功了,谢谢! - Natetronn

8

使用像Notepad++这样的文本编辑器,可以帮助您了解行尾。

它将在工具栏上显示行尾格式,如Unix(LF)或Macintosh(CR)或Windows(CR LF)。

输入图像描述

您还可以转到“视图” ->“显示符号” ->“显示行尾”,以显示行尾为LF / CR LF / CR。

输入图像描述


4
我也正在寻找“本地”的 Windows 脚本解决方案。目前,只需以二进制方式读取一行或两行 VB 代码并检查字符即可。一个手动检查的工具是 Notepad ++。状态栏在文件编码指示器旁边的右端有一个换行符样式指示器。在 7.5.6 版本中它看起来像这样:enter image description here。其他具有十六进制模式的编辑器也可以显示给您。在 Powershell 中,此命令对于 Windows 风格文件返回“True”,而对于 *nix 风格文件返回“False”。
(Get-Content '\\FILESERVER0001\Fshares\NETwork Shares\20181206179900.TXT' -Raw) -match "\r\n$" 

这是来自Matt的内容:https://dev59.com/pZTfa4cB1Zd3GeqPKgBT#35354009

0

因此,对于现代软件上工作的计算机程序员来说,最重要的一点是要记住,任何CR和LF的组合,都需要被视为换行符。你几乎不会看到“旧”的Mac,即只有CR而没有LF - 我更喜欢忽略它相对微小的存在。我倾向于使用1字节文件处理,但这是个人偏好(在这种情况下,这种偏好会带来回报)。通过使您的代码能够适应文本文件的行结束格式,展示自己作为程序员的熟练程度。


如果您能告诉如何检查行尾字符,那将更好。 - charmian
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0
在批处理文件中,您可以尝试将文件转换为CRLF并检查其大小是否增加:
rem check-crlf.bat

@echo off
setlocal

call type "%~1" | c:\Windows\System32\find.exe "" /v > "%~1.temp"
set size1=%~z1
rem add 2 in case the file doesn't have a trailing newline, since find will add it
set /a size1plus2=%size1%+2
call :setsize2 "%~1.temp%"

for /f %%a in ('c:\Windows\System32\findstr /R /N "^" "%~1" ^| c:\Windows\System32\find /C ":"') do set lines=%%a

if %size1plus2% equ %size2% (
    if %lines% equ 2 (
        echo File uses LF line endings!
    ) else (
        echo File uses CRLF or has no line endings!
    )
) else (
    if %size1% lss %size2% (
        echo File uses LF line endings!
    ) else (
        echo File uses CR+LF line endings!
    )
)
del "%~1.temp"
exit /b

:setsize2
set size2=%~z1
exit /b

我们正在处理没有尾随换行符的文件的特殊情况,以及具有两个以LF结尾的换行符的文件,这两种情况都会导致增加2个字节。

用法:

check-crlf.bat file-i-care-about.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接