Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление нежелательных символов из строки.

Ответить
Настройки темы
CMD/BAT - [решено] Удаление нежелательных символов из строки.

Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Изменения
Автор: Amunrah
Дата: 25-10-2018
Доброго времени суток уважаемые форумчане, в процессе написания батника возникла задача - очистить строки от нежелательных символов. Нежелательные символы, в идеале, это - !"№@#$^&*\|/?:%<~>` Частично проблема решается, но не со всеми символами прокатывает. Например &,%,<,>,| и " (двойная кавычка) ведут себя странновато. Подскажите способ их аккуратно извлечь и удалить не потеряв исходный текст, учитывая что строки читаются из файла, нельзя предугадать появление символов и нет возможности экранировать их в файле. Пример того что уже есть:

IN:
Код: Выделить весь код
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 866>nul
rem ...обрабатываемый текст построчно читается из файла и имеет примерно следующий вид
set str=some *long:: ##\text %@and ~more /more !more "этот текст просто обрежется из-за кавычки

call :clean_out_str %str%

echo исходная строка - "%str%"
echo результат - "%clean_str%"

pause >nul
exit

:clean_out_str <str_for_clean>
set this_str=%*
set clean_str=
set /a char_counter=0

rem поиск и удаление нежелательных символов
:del_unwanted_chars
for /f "delims=" %%l in ("!this_str:~%char_counter%,1!") do (
    set current_char=%%~l
    if "!current_char!" NEQ "" (
        for /f %%f in ('echo "!current_char!"^|findstr /i /r "[\\|/?:*#@!%&~$<>]"') do (
            echo.%%f
            if %%f NEQ "" (
                set current_char=
                goto :next
            )
        )
        :next
        set clean_str=!clean_str!!current_char!
        set /a char_counter+=1
        goto :del_unwanted_chars
    )
)
exit /b
ENDLOCAL
OUT:
Код: Выделить весь код
"*"
":"
":"
"#"
"#"
"\"
"@"
"~"
"/"
исходная строка - "some *long:: ##\text @and ~more /more more "этот текст просто обрежется из-за кавычки"
результат - "some long text and more more more "
Возможно есть альтернативные решения...

Отправлено: 16:36, 25-10-2018

 

Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt ibases.txt
(1.7 Kb, 4 просмотров)

Цитата megaloman:
Если в Вашем тексте нет гос секретов и вмешательства в американские выборы, хотелось бы протестировать решения на Вашем реальном файле.
И, однозначно, при разных кодировках файлов надо подбирать, как сохранить строку заменяемых символов - её кодировка должна совпадать с кодировкой файла.
По видимому, корректнее задавать эту строку в виде массива кодов символов. »
Никаких гос-секретов )) Все гораздо прозаичнее. Хотя подобные штуки уже есть, но, по разным причинам, решил написать свой инструмент для архивирования файловых инфобаз 1с. BAT-ник мал да удал и работает везде. Вобщем - если вам интересно в двух словах - тулза, являясь частью системы автоматизации, формирует меню выбора в виде списка баз на основе файлика ibases.v8i, в котором, среди прочего, хранятся имена и пути. Сам файл, насколько я понял, всегда имеет кодировку utf-8 c bom, поэтому приходится сначала конвертить его в cp866 во временный файл и только потом уже парсить. Это для совместимости батника с WinXP (конвертирую с помощью win_iconv). В результате все просто - нужно лишь выбрать информационную базу из списка меню, а все пути подставятся сами и она благополучно улетит в датированный архив (через 7zip_extra) в подкаталог с именем базы. (это быстро и удобно + сама 1С, во избежание, рекомендует делать архивы копированием, а не выгрузкой - https://its.1c.ru/db/metod8dev#content:2922:hdoc)
Проблемы появляются, когда пользователь с фантазией не скучно и не стандартно обзывает свои базы, поэтому и возникает необходимость прогонять некоторые строки файла через фильтр. Если подходить строго, то удалять нужно символы, которые нельзя использовать в путях, но задача показалась мне интересной и для универсальности хотелось бы менять набор символов в широком диапазоне.
п.с. Понимаю, что практически на любом другом интерпретируемом языке реализовать подобное не составило бы большого труда, однако нужно чтобы и работало на любом компе.

п.п.с Файлик во вложении

Последний раз редактировалось Amunrah, 26-10-2018 в 13:43.


Отправлено: 09:36, 26-10-2018 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Задача оказалась решаемой. Просто нужно быть аккуратнее с синтаксисом. Оставлю тут, может кому-то тоже пригодится:

IN:
Код: Выделить весь код
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 866>nul
rem ...обрабатываемый текст построчно читается из файла и имеет примерно следующий вид
set "str=some *long:?: $long #&#\te=^^xt <%@and |~№more /more> !more"

call :clean_out_str "%str%"

echo исходная строка - "%str%"
echo результат - %clean_str:"=%

pause >nul
exit

:clean_out_str <str_for_clean>
set this_str=%*
set clean_str=
set /a char_counter=0

rem поиск и удаление нежелательных символов
:del_unwanted_chars
for /f "delims=" %%l in ("!this_str:~%char_counter%,1!") do (
    set current_char=%%~l
    if !current_char! NEQ "" (
        for /f %%f in ('echo "!current_char!"^|findstr /r "[\\|/?:*#^^=@!%&~$<>№]"') do (
            echo.%%f
            if %%f NEQ "" (
                set current_char=
            )
        )
        set clean_str=!clean_str!!current_char!
        set /a char_counter+=1
        goto :del_unwanted_chars
    )
)
exit /b
ENDLOCAL
OUT:
Код: Выделить весь код
"*"
":"
"?"
":"
"$"
"#"
"&"
"#"
"\"
"="
"^"
"^"
"<"
"@"
"|"
"~"
"№"
"/"
">"
исходная строка - "some *long:?: $long #&#\te=^xt <@and |~№more /more> more"
результат - some long long text and more more more
Только кавычки приходится удалять стандартно %result:"=% Тут пример с заданной строкой, поэтому не получается использовать кавычки не экранируя их, но при чтении строк циклом из файла проблем не возникло. Единственное не удалось победить восклицательный и знак процента - по одиночке они пропадают сами, а в паре вырезают часть заключенного в них текста, не понятно как запретить интерпретатору считать их частью переменной. Но, думаю, это мелочи... радует сам факт, и cmd, как оказалось, не так уж плох )

Последний раз редактировалось Amunrah, 26-10-2018 в 20:12.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:11, 26-10-2018 | #12


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Amunrah,
кроме парных кавычек проблемы с удалением может доставить знак "="
еще почему-то нет "^", хотя тоже проблемный символ.
вообще как по мне достаточно варианта что я приводил из п7, проблемные строки просто игнорируются с выводом на экран и если учесть что проблемные строки из вашего файла претерпевают изменение, то небольшая разница с игнорированием или можно сделать замену на "name(N+1)"

Последний раз редактировалось alpap, 26-10-2018 в 19:00.


Отправлено: 18:43, 26-10-2018 | #13


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


alpap:
Цитата alpap:
Amunrah,
кроме парных кавычек проблемы с удалением может доставить знак "="
еще почему-то нет "^", хотя тоже проблемный символ.
вообще как по мне достаточно варианта что я приводил из п7, проблемные строки просто игнорируются с выводом на экран и если учесть что проблемные строки из вашего файла претерпевают изменение, то небольшая разница с игнорированием или можно сделать замену на "name(N+1)" »
Да, вы правы, во многих случаях вполне достаточно вашего варианта, но это скорее обходной маневр,а мне просто хотелось разобраться в проблеме... )
Дополнил регулярку - [\\|/?:*#^^=@!%&~$<>] - при чтении из файла срабатывает нормально, однако если задавать строку в батнике, то символ ^ нужно экранировать ^^

Последний раз редактировалось Amunrah, 26-10-2018 в 19:31.


Отправлено: 19:24, 26-10-2018 | #14


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Не может быть, чтобы на разных машинах файл для суперзадачи приходит в разных кодировках. »
Именно так.

Цитата megaloman:
Как не изгаляйся, останется вопрос: а зачем всё это нужно? »
Я пишу проще: «нахрена?» .


Amunrah, многое из того, что Вы выбрасываете, вполне допустимо в путях и именах файлов: Naming Files, Paths, and Namespaces | Microsoft Docs. И да — разворачиваете на Windows XP PowerShell 2.0 и перестаёте заниматься извращениями на пакетных файлах ([System.IO.Path]::GetInvalidPathChars()/[System.IO.Path]::GetInvalidFileNameChars()).
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:04, 26-10-2018 | #15


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Iska
Цитата Iska:
Amunrah, многое из того, что Вы выбрасываете, вполне допустимо в путях и именах файлов: Naming Files, Paths, and Namespaces | Microsoft Docs. И да — разворачиваете на Windows XP PowerShell 2.0 и перестаёте заниматься извращениями на пакетных файлах ([System.IO.Path]::GetInvalidPathChars()/[System.IO.Path]::GetInvalidFileNameChars()). »
Кто же спорит, но я ведь уже писал, что такой набор символов был выбран интереса ради и общей пользы для. В итоге с удалением недопустимых знаков батник справляется на ура плюс имеет некоторую гибкость и универсальность. Естественно на своем железе можно развернуть вообще все что угодно, вопрос выбора CMD возникает когда нужно автоматизировать рутину на куче чужих машин, где что-то устанавливать, как минимум, лишняя потеря времени...

Последний раз редактировалось Amunrah, 26-10-2018 в 22:42.


Отправлено: 21:03, 26-10-2018 | #16



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление нежелательных символов из строки.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удаление строки из текстового файла Elven Скриптовые языки администрирования Windows 2 29-11-2013 17:44
CMD/BAT - удаление строки из файла HFShak Скриптовые языки администрирования Windows 5 05-11-2013 21:14
CMD/BAT - [решено] Вычитание символов из строки и вывод на экран Instant_SR Скриптовые языки администрирования Windows 4 25-07-2013 11:37
Вопрос - Удаление нежелательных драйверов и восстановление доступа к устройствам tovit Хочу все знать 14 29-01-2013 09:57
[решено] Удаление строки из файла gregaz AutoIt 2 16-07-2009 18:46




 
Переход