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 писал(а): У меня имеется такое предположение. Хорошо, пусть у нас есть конструкция [^...]. Как в командной строке передать туда символы перевода строки, возврата каретки, 0X?
Есть разные grep-ы. Некоторые, вроде, поддерживают отрицание. То есть, можно написать запрос, который семантически можно трактовать как "не что-то". И написать в запросе вместо "что-то" все пробельные символы. |
Автор: | Александр Ильин [ Понедельник, 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 Остановился на подходе с FOR потому, что вообще всё делается средствами интерпретатора CMD, без привлечения сторонних утилит.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 Обращаю внимание на то, что без параметра "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/ |