Подсчитайте количество новых строк (как Unix, так и Windows) - PullRequest
1 голос
/ 17 апреля 2019

У меня есть текстовый файл, и я хочу написать командный файл, чтобы убедиться, что он содержит только одну строку с определенным содержимым без какой-либо новой строки в конце указанной строки.

Сравнение содержимого строкине сложно, так как я могу просто прочитать это в переменную и затем сравнить с тем, что я ожидаю.

Моя проблема в том, чтобы утверждать, что вокруг нет лишних переводов строки.Пока есть только окончания строк Windows (CRLF), я могу сделать это довольно легко, посчитав количество строк, заканчивающихся символом новой строки, аналогично здесь :

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 ]

2 голосов
/ 18 апреля 2019

Если все, что вы хотите сделать, это убедиться, что в файле нет новых строк, то

(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"
2 голосов
/ 17 апреля 2019

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%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...