我有一个文本文件,想要编写一个批处理文件以验证它仅包含一行具有特定内容的行,而在该行的末尾没有任何换行符。
比较该行的内容并不困难,因为我可以将其读入一个变量,然后将其与期望值进行比较。
我的问题是 断言周围没有多余的换行符。只要只有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的数量?
答案 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"