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

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

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

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


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

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


Есть текст, который нужно привести в надлежащий вид, для этого нужно удалить все знаки после ; т.е. неудаляем;не удаляем;здесь удаляем весь текст после ; и точку с запятой тоже. Возможно ли такое?
Заранее спасибо.

Отправлено: 12:27, 05-11-2010

 

Аватара для El Sanchez

Ветеран


Contributor


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

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


hxygen,
Код: Выделить весь код
@Echo Off
Set Source=C:\Source\test.txt

For /F "Tokens=1,2 Delims=;" %%A In ('Type "%Source%"') Do Echo %%A;%%B>>"%Temp%\_tmp"
Move /Y "%Temp%\_tmp" "%Source%"
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:08, 05-11-2010 | #2



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

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


Ветеран


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

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


Для того чтобы привести текст в наждежащий вид не обязательно пользоваться исключительно cmd-скриптами. WSH и PS более полноценно работают с файлами и текстом. Ну и множество текстовых редактором позворяет производить массовые поиск, замену и т.п.

Регулярными выражениями это запишется примерно как замена
(^.*);[^;]*
на
\1

El Sanchez, For поделит по первому знаку-разделителю, а hxygen'у, судя по примеру, требуется убирать всё, что после последнего. Ко всему прочему надо было просто echo %%A, а в таком виде файл не меняется.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:12, 05-11-2010 | #3


Googler


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

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


вариант на AWK:
Код: Выделить весь код
awk "{gsub(/;[^;]*$/,\"\");print}" 1.txt >2.txt
вариант на SED:
Код: Выделить весь код
sed "s/;[^;]*$//g" 1.txt >2.txt
P.S. некоторые сборки SED могут некорректно обрабатывать переносы строк, заменяя CRLF -> LF
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:26, 05-11-2010 | #4


Googler


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

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


до кучи, вариант штатными средствами (увы, только посимвольно):
Код: Выделить весь код
@echo off 

SETLOCAL DisableDelayedExpansion
(for /f "usebackq delims=" %%l in ("1.txt") do (set "$l=%%l"
  SETLOCAL EnableDelayedExpansion
  set $l|find ";">nul&& call :TRIM
  echo.!$l!
  ENDLOCAL
)) >2.txt
ENDLOCAL& EXIT

:TRIM
 set "$c=!$l:~-1!"& set "$l=!$l:~,-1!"
 if not "!$c!"==";" goto TRIM
GoTo :EOF
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:05, 05-11-2010 | #5


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


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

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


Спасибо всем, но amel27 отдельное мерси Awk не первый раз выручает.

Отправлено: 14:37, 05-11-2010 | #6


Аватара для El Sanchez

Ветеран


Contributor


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

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


Вдогонку...
Busla,
Цитата hxygen:
т.е. неудаляем;не удаляем;здесь удаляем весь текст после ; и точку с запятой тоже »
Я понял это как строки вида aaa;bbb;ccc переделать в aaa;bbb

hxygen, ну а если нужна рекурсия,то
Код: Выделить весь код
@Echo Off
Set Source=C:\Source\test.txt

SetLocal EnableDelayedExpansion
For /F "Tokens=1* Delims=;" %%A In ('Type "%Source%"') Do Call :Func "%%A" "%%B"
Move /Y "%Temp%\_tmp" "%Source%"
EndLocal
GoTo :EOF

:Func
If "!Str!"=="" (Set Str=%~1) Else (Set Str=!Str!;%~1)
Echo.%~2|Find ";" 1>nul&&(For /F "Tokens=1* Delims=;" %%A in (%2) Do Call :Func "%%A" "%%B")||(If Not "!Str!"=="" Echo.!Str!>>"%Temp%\_tmp"&Set Str=)
Ограничения: пустые строки удаляются; строка не должна содержать символ "!", иначе будут "сюрпризы"

Последний раз редактировалось El Sanchez, 08-11-2010 в 17:05. Причина: добавил ограничения. Спасибо amel27 за намек

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

Отправлено: 17:19, 05-11-2010 | #7


Googler


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

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


Цитата El Sanchez:
ну а если нужна рекурсия »
интересный подход, вариация на ту же тему, но без рекурсии:
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion
Set SRC=1.txt

(For /F "UseBackQ Delims=" %%L In ("%SRC%") Do (
Set "$L=%%L"& Set "$O="& CALL :SUB& Echo.!$O!
))>"%~dpn0.tmp"
Copy /y "%~dpn0.tmp" "%SRC%">nul&& DEL "%~dpn0.tmp"
Exit

:SUB
For /F "Tokens=1,2* Delims=;" %%A In ("!$L!") Do (
If "%%B"=="" Set "$O=%%A"& GoTo :EOF
If "%%C"=="" Set "$O=!$O!%%A"& GoTo :EOF
Set "$L=%%B;%%C"& Set "$O=!$O!%%A;"& GoTo :SUB)
ограничения данной реализации:

- удаляются пустые строки
- удаляются множественные ";" (";;;" -> ";")
- удаляются символы "!"/ текст между "!"
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:34, 06-11-2010 | #8


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


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

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


amel27, Можно тоже самое, только чтобы удалял текст ДО ИСКОМОГО СЛОВА ??? *(до FIND "...")
Код: Выделить весь код
@echo off     SETLOCAL DisableDelayedExpansion  (for /f "usebackq delims=" %%l in ("1.txt") do (set "$l=%%l"    SETLOCAL EnableDelayedExpansion    set $l|find ";">nul&& call :TRIM    echo.!$l!    ENDLOCAL  )) >2.txt  ENDLOCAL& EXIT    :TRIM   set "$c=!$l:~-1!"& set "$l=!$l:~,-1!"   if not "!$c!"==";" goto TRIM  GoTo :EOF

Отправлено: 00:23, 15-11-2010 | #9


Googler


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

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


Цитата rapbit90:
Можно тоже самое, только чтобы удалял текст ДО ИСКОМОГО СЛОВА ? »
...если речь о том же, о чём в первом посте - удалить текст в каждой строке:
Код: Выделить весь код
@echo off

set file=1.txt
set word=\

SETLOCAL DisableDelayedExpansion
(for /f "usebackq delims=" %%l in ("1.txt") do (set "$l=%%l"
SETLOCAL EnableDelayedExpansion& set "$l=!$l:*%word%=%word%!"
echo.!$l!
ENDLOCAL))>"%~dpn0.tmp"
copy /y "%~dpn0.tmp" "%file%"&& del "%~dpn0.tmp"
ENDLOCAL

Отправлено: 06:12, 15-11-2010 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
После сохранения документа - знаки вопроса Artem-Samsung Хочу все знать 1 26-09-2010 13:18
Прочее - Как удалить все маршруты из таблицы маршрутизации? andrystepa Общий по Linux 2 12-10-2009 14:38
[решено] После лечения от паразитов диски открывается в командной строке freese Лечение систем от вредоносных программ 2 31-07-2009 15:11
Разное - Как удалить все учетные записи? samchik Наборы обновлений для Windows XP/2003/Windows 7 2 03-08-2008 16:25
Как удалить все временный файлы (уже после перезагрузки компа)...? Cobra_1_Stas Автоматическая установка Windows 2000/XP/2003 4 01-04-2008 07:14




 
Переход