【问题标题】:On windows, how would I detect the line ending of a file?在 Windows 上,我将如何检测文件的行尾?
【发布时间】:2015-11-22 05:05:18
【问题描述】:

我已经看到了这些问题的答案,但这些答案并不是从 Windows 的角度来看的。

Windows 使用 CR LF,Unix 使用 LF,Mac 使用 LF,经典 mac 使用其他东西。我没有能力告诉我,如果文件使用的行尾与我输入的不同,那么在尝试运行脚本/程序时会出错,坦率地说,这没有多大意义。转换后,脚本运行良好。

在 Windows 上是否可以先发制人地检查文件使用的行尾?

【问题讨论】:

  • 使用十六进制编辑器,分别查找字符 0x0D0x0A。它们这对(按此顺序)构成一个 Windows 行结束。
  • 如果你用记事本打开文件,很明显它是否有非 Windows EOL 字符(因为记事本不会将它们视为 EOL)。不过,这假设文件是​​一致的 - 如果只有几个不匹配的 EOL 序列,它可能并不明显。
  • 被低估的问题。

标签: windows file line-breaks line-endings eol


【解决方案1】:

在批处理文件中,您可以尝试将文件转换为 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

【讨论】:

    【解决方案2】:

    使用notepad++之类的文本编辑器,可以帮助您理解行尾。

    它将在工具的任务栏上显示用作 Unix(LF) 或 Macintosh(CR) 或 Windows(CR LF) 的行结束格式。

    你也可以去查看->显示符号->显示行尾显示行尾为LF/CR LF/CR。

    【讨论】:

      【解决方案3】:

      步骤:

      然后就可以执行了:

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

      my-lf-file.txt; ASCII 文本

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

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

      当然,您可以将c:\gnuwin32\bin 添加到您的%PATH% 变量中,这样就可以在不提供完整路径的情况下访问它。


      更新:

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

      • 或者您可以安装this 子系统,如Microsoft 官方文档中所述,并访问file 命令。

      【讨论】:

      • 更新效果很好,谢谢!
      【解决方案4】:

      我也在寻找“本机”Windows 脚本解决方案。到目前为止,只需在 VB 中以二进制方式读取一行或两行并检查字符。

      “手动”检查的一个工具是 Notepad++。状态栏在文件编码指示符旁边的右端有一个换行符样式指示符。

      在 7.5.6 版本中看起来像这样

      其他具有十六进制模式的编辑器也可以向您展示。

      在 Powershell 中,此命令对于 Windows 样式文件返回“True”,对于 *nix 样式文件返回“False”。

      (Get-Content '\\FILESERVER0001\Fshares\NETwork Shares\20181206179900.TXT' -Raw) -match "\r\n$" 
      

      这里来自马特:https://stackoverflow.com/a/35354009/1337544

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2013-07-12
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 2012-12-08
        • 2012-08-23
        相关资源
        最近更新 更多