OberonCore
https://forum.oberoncore.ru/

Нужна утилита для проверки файла на "пустоту"
https://forum.oberoncore.ru/viewtopic.php?f=27&t=2467
Страница 1 из 1

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 01:07 ]
Заголовок сообщения:  Нужна утилита для проверки файла на "пустоту"

Подскажите, пожалуйста. Копался сегодня в Интернетах, не мог найти готовой реализации вот такой консольной программы под Windows:
Код:
MODULE Blank;

(* ------------------------------------------------------------------------
 * (c) 2010 by Alexander Iljin
 * ------------------------------------------------------------------------ *)

IMPORT In;

(** -----------------------------------------------------------------------
  * This console program returns 1 if a non-blank character was read from
  * StdIn.
  * ----------------------------------------------------------------------- *)

VAR
   ch: CHAR;
BEGIN
   In.Open;
   In.Char (ch);
   WHILE In.Done & (ch <= ' ') DO
      In.Char (ch);
   END;
   IF ~In.Done THEN
      HALT (1);
   END;
END Blank.

Пробовал grep, findstr, sfk - не получается. То ли я сегодня торможу, то ли что. Есть ли в природе утилита, которая бы подобное действие выполняла?

Общая задача - проверка непустоты сообщения в Subversion pre-commit hook (server-side). Другими словами, надо определить, есть ли в неком файле значимые символы (кроме пробелов, переводов строки, табуляции и прочего неотображаемого мусора). В шаблоне, поставляемом с Subversion, предлагается использовать grep "[a-zA-Z0-9]", но это, очевидно, не катит для русскоязычных сообщений. Пробовал расширить выражения до [a-zA-Z0-9а-яА-Я] - не срабатывает, скорее всего из-за разницы в кодировках между консолью и Subversion. Может быть, я что-то не знаю про регулярные выражения, или про стыковку кодировок подскажете?

Автор:  Valery Solovey [ Понедельник, 22 Март, 2010 14:50 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

У меня имеется такое предположение.
Есть разные grep-ы. Некоторые, вроде, поддерживают отрицание. То есть, можно написать запрос, который семантически можно трактовать как "не что-то". И написать в запросе вместо "что-то" все пробельные символы.

Автор:  Comdiv [ Понедельник, 22 Март, 2010 14:58 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Может это подойдет. Чистит пробелы и табуляции, насчет других символов - не знаю.
Код:

REM some commands

CALL :BLANK %check_string%

REM some commands


GOTO :EOF

:BLANK
IF not "%1"=="" EXIT /b 1

Автор:  Евгений Темиргалеев [ Понедельник, 22 Март, 2010 15:08 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Александр, Ваша утилита не подходит? Нужно именно регулярным выражением?

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 15:13 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Valery Solovey писал(а):
У меня имеется такое предположение.
Есть разные grep-ы. Некоторые, вроде, поддерживают отрицание. То есть, можно написать запрос, который семантически можно трактовать как "не что-то". И написать в запросе вместо "что-то" все пробельные символы.
Хорошо, пусть у нас есть конструкция [^...]. Как в командной строке передать туда символы перевода строки, возврата каретки, 0X?

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 15:36 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Евгений Темиргалеев писал(а):
Александр, Ваша утилита не подходит? Нужно именно регулярным выражением?
Подходит, и даже уже работает по назначению. Вопрос просто в том, как бы не плодить зоопарк утилит, а научиться пользоваться существующими. Пакет GNU-утилит у меня итак уже установлен, неужели же задача настолько нетипичная?

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 15:45 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Comdiv писал(а):
Может это подойдет. Чистит пробелы и табуляции, насчет других символов - не знаю.
Интересный вариант, спасибо. Вынудил посмотреть справку к CALL, узнал кое-что новое для себя. Проблема, однако, в том, что требуется проверить потенциально многострочный файл. Как это сделать? Оформить циклом?

Автор:  Евгений Темиргалеев [ Понедельник, 22 Март, 2010 16:13 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Александр Ильин писал(а):
... требуется проверить потенциально многострочный файл. Как это сделать? Оформить циклом?
Вместо той "отдельной утилиты" (подпрограммы) воспользоваться Вашей :)

Автор:  Comdiv [ Понедельник, 22 Март, 2010 16:26 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Для многострочного вывода можно посмотреть на следующий сценарий:
Код:
CALL :CHECK type test.txt

GOTO :EOF

:CHECK
FOR /F %%i IN ('%*') DO EXIT /b 1


вместо "type test.txt" пишите нужную команду, и ее вывод будет разобран FOR; если в нем будет хоть одна не пустая строка, выполнится EXIT /b 1

Автор:  albobin [ Понедельник, 22 Март, 2010 16:40 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

cat file|tr -d [:space:] |tr -d [:cntrl:] |wc -c

Автор:  Valery Solovey [ Понедельник, 22 Март, 2010 16:47 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Александр Ильин писал(а):
Как в командной строке передать туда символы перевода строки, возврата каретки, 0X?
Не понятно, зачем воспринимать символ 0X как пробельный. Он же ведь не должен появляться в тексте в обычных случаях.

Вот вариант с sed, поскольку с grep отрицание у меня не работает.

cat test.txt | sed -e '/[^ \r\n\x0]/!d'

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 17:20 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Александр Ильин писал(а):
Как это сделать? Оформить циклом?
Эврика!
Код:
:: Make sure that the log message contains some text.
set result=1
for /f "eol= " %%i in (%TMPFILE%) do set result=0
if %result% == 1 (
  echo Commits with empty log message are not allowed. >&2
)

del %TMPFILE% > NUL
exit %result%

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 17:28 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Valery Solovey писал(а):
cat test.txt | sed -e '/[^ \r\n\x0]/!d'
Во, уже похоже на правду!
Тогда уж так: [^\x0- ], чтобы табуляции и прочий мусор учесть. Это, пожалуй, будет наиболее близко к озвученным требованиям.
Ещё, пожалуй cat не нужен: sed -e '/[^\x0- ]/!d' < test.txt

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 17:42 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

albobin писал(а):
cat file|tr -d [:space:] |tr -d [:cntrl:] |wc -c
Спасибо! Тоже отличный вариант. Почитал справку по tr и wc, буду иметь их в виду.

Автор:  Александр Ильин [ Понедельник, 22 Март, 2010 19:35 ]
Заголовок сообщения:  Re: Нужна утилита для проверки файла на "пустоту"

Comdiv писал(а):
CALL :CHECK type test.txt
Понравилось, что просмотр файла прервётся как только будет найдена непустая строка (в моём предыдущем коде всегда весь файл просматривался целиком). Поэтому окончательный вариант у меня такой:
Код:
@echo off
set REPOS="%1"
set TXN="%2"
set TMPFILE=Log%RANDOM%.tmp

:: Make sure that the log message contains some text.
svnlook log -t %TXN% %REPOS% > %TMPFILE%
call :CheckBlank %TMPFILE%
set result=%errorlevel%
if %result% == 1 (
  echo Commits with empty log message are not allowed. >&2
)

del %TMPFILE% > NUL
exit %result%

:: Return 1 if %1 is a blank file, otherwise return 0
:CheckBlank
for /f "eol= " %%i in (%1) do exit /b 0
exit /b 1
Остановился на подходе с FOR потому, что вообще всё делается средствами интерпретатора CMD, без привлечения сторонних утилит.

Обращаю внимание на то, что без параметра "eol= " строки, начинающиеся с символа ";", считаются пустыми.

Данный файл именуется "pre-commit.bat" и помещается в каталог hooks любого репозитория Subversion, после чего попытка сделать коммит в данный репозиторий без описания (т.е. с пустым log message) прерывается с сообщением об ошибке "Commits with empty log message are not allowed." Помогает против случайного/преждевременного коммита и неопытных сотрудников.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/