计算换行符的数目(Unix和Windows)

时间:2019-04-17 11:31:50

标签: batch-file cmd

我有一个文本文件,想要编写一个批处理文件以验证它仅包含一行具有特定内容的行,而在该行的末尾没有任何换行符。

比较该行的内容并不困难,因为我可以将其读入一个变量,然后将其与期望值进行比较。

我的问题是 断言周围没有多余的换行符。只要只有Windows行尾(CRLF),我就可以很容易地做到这一点,只需计算以换行符结尾的行数即可,类似于here

Set num_of_endlines=0
For /f "tokens=1 delims=:" %%i in ('FINDSTR /r /n "$" %filepath%') DO (
    Set num_of_endlines=%%i
)

如果num_of_endlines为0,那么一切都很好。

我的问题是,此方法不适用于Unix行尾。我还尝试计算行首("^")而不是行尾("$")。现在捕获了领先的换行符,无论它们是CRLF还是LF,都可以改善结果。但这不会在第一行的末尾捕获换行符(甚至没有CRLF)。有没有办法使用批处理文件来计算文本文件中CRLF和LF的数量?

2 个答案:

答案 0 :(得分:2)

Windows FINDSTR不完全支持正则表达式。但是,PowerShell可以做到。注意使用-Raw来获取文件的内容。这是查看换行字节所必需的。

SET "THEFILE=t.bash"

FOR /F %%a IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-Content -Path '%THEFILE%' -Raw | Select-String -Pattern '\x0a|\x0d' | Measure-Object).Count"') DO (
    SET "LINECOUNT=%%a"
)

ECHO LINECOUNT is %LINECOUNT%

答案 1 :(得分:2)

如果您只想确认文件没有换行符,那么

(type "%filepath%" & echo x) | findstr /n "^" | findstr "^2:" >nul && (
  echo FAIL: The file has at least one newline
) || (
  echo SUCCESS: The file does not have any newlines
)

如果您需要实际计算换行数,则

for /f %%N in (
 '(type "%filepath%" ^& echo x^) ^| findstr /n "^" ^| find /c /v ""'
) do set /a cnt=%%N-1

或者您可以让FINDSTR直接搜索换行符!

如果您需要验证文件没有换行符

@echo off
setlocal enableDelayedExpansion

set "filepath=...."

(set LF=^
%= This defines a newline variable =%
)

findstr "!LF!" "%filepath%" && (
  echo FAIL: The file contains at least one newline
) || (
  echo SUCCESS: The file does not contain any newlines
)

或者计算换行数

@echo off
setlocal disableDelayedExpansion

set "filepath=...."

(set LF=^
%= This defines a newline variable =%
)

for /f %%N in (
  'cmd /v:on /c findstr "!LF!" "%filepath%" ^| find /c /v ""'
) do set "cnt=%%N"