|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление нежелательных символов из строки. |
|
CMD/BAT - [решено] Удаление нежелательных символов из строки.
|
Новый участник Сообщения: 24 |
Доброго времени суток уважаемые форумчане, в процессе написания батника возникла задача - очистить строки от нежелательных символов. Нежелательные символы, в идеале, это - !"№@#$^&*\|/?:%<~>` Частично проблема решается, но не со всеми символами прокатывает. Например &,%,<,>,| и " (двойная кавычка) ведут себя странновато. Подскажите способ их аккуратно извлечь и удалить не потеряв исходный текст, учитывая что строки читаются из файла, нельзя предугадать появление символов и нет возможности экранировать их в файле. Пример того что уже есть:
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 Возможно есть альтернативные решения... |
|
Отправлено: 16:36, 25-10-2018 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Проблемы появляются, когда пользователь с фантазией не скучно и не стандартно обзывает свои базы, поэтому и возникает необходимость прогонять некоторые строки файла через фильтр. Если подходить строго, то удалять нужно символы, которые нельзя использовать в путях, но задача показалась мне интересной и для универсальности хотелось бы менять набор символов в широком диапазоне. п.с. Понимаю, что практически на любом другом интерпретируемом языке реализовать подобное не составило бы большого труда, однако нужно чтобы и работало на любом компе. п.п.с Файлик во вложении |
|
Последний раз редактировалось Amunrah, 26-10-2018 в 13:43. Отправлено: 09:36, 26-10-2018 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 24
|
Профиль | Отправить 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 "*" ":" "?" ":" "$" "#" "&" "#" "\" "=" "^" "^" "<" "@" "|" "~" "№" "/" ">" исходная строка - "some *long:?: $long #&#\te=^xt <@and |~№more /more> more" результат - some long long text and more more more |
Последний раз редактировалось Amunrah, 26-10-2018 в 20:12. Отправлено: 18:11, 26-10-2018 | #12 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Amunrah,
кроме парных кавычек проблемы с удалением может доставить знак "=" еще почему-то нет "^", хотя тоже проблемный символ. вообще как по мне достаточно варианта что я приводил из п7, проблемные строки просто игнорируются с выводом на экран и если учесть что проблемные строки из вашего файла претерпевают изменение, то небольшая разница с игнорированием или можно сделать замену на "name(N+1)" |
Последний раз редактировалось alpap, 26-10-2018 в 19:00. Отправлено: 18:43, 26-10-2018 | #13 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать alpap:
Цитата alpap:
Дополнил регулярку - [\\|/?:*#^^=@!%&~$<>] - при чтении из файла срабатывает нормально, однако если задавать строку в батнике, то символ ^ нужно экранировать ^^ |
|
Последний раз редактировалось Amunrah, 26-10-2018 в 19:31. Отправлено: 19:24, 26-10-2018 | #14 |
Ветеран Сообщения: 27449
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать Iska
Цитата Iska:
|
|
Последний раз редактировалось Amunrah, 26-10-2018 в 22:42. Отправлено: 21:03, 26-10-2018 | #16 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|