CMD/BAT - [решено] Удалить все знаки в строке после ;
-
hxygen
CMD/BAT - [решено] Удалить все знаки в строке после ;
Есть текст, который нужно привести в надлежащий вид, для этого нужно удалить все знаки после ; т.е. неудаляем;не удаляем;здесь удаляем весь текст после ; и точку с запятой тоже. Возможно ли такое?
Заранее спасибо.
Заранее спасибо.
-
hxygen
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
amel27, Что-то батник этот не действует, я попробовал точную копию, мой файл остаётся неизменным, дописал в код
ENDLOCAL))>C:\DEL2.txt
ENDLOCAL
И он просто копирует всё из файла 1.txt который обрабатывает. Заполняю вроде всё правильно
"set word=buy", слов buy содержится в файле 1.txt, но ничего не делается=(
ENDLOCAL))>C:\DEL2.txt
ENDLOCAL
И он просто копирует всё из файла 1.txt который обрабатывает. Заполняю вроде всё правильно
"set word=buy", слов buy содержится в файле 1.txt, но ничего не делается=(
-
Busla
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
Для того чтобы привести текст в наждежащий вид не обязательно пользоваться исключительно cmd-скриптами. WSH и PS более полноценно работают с файлами и текстом. Ну и множество текстовых редактором позворяет производить массовые поиск, замену и т.п.
Регулярными выражениями это запишется примерно как замена
(^.*);[^;]*
на
\1
El Sanchez, For поделит по первому знаку-разделителю, а hxygen'у, судя по примеру, требуется убирать всё, что после последнего. Ко всему прочему надо было просто echo %%A, а в таком виде файл не меняется.
Регулярными выражениями это запишется примерно как замена
(^.*);[^;]*
на
\1
El Sanchez, For поделит по первому знаку-разделителю, а hxygen'у, судя по примеру, требуется убирать всё, что после последнего. Ко всему прочему надо было просто echo %%A, а в таком виде файл не меняется.
-
El Sanchez
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
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%"-
amel27
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
вариант на
Код:
вариант на
Код:
P.S. некоторые сборки SED могут некорректно обрабатывать переносы строк, заменяя CRLF -> LF
AWK
:Код:
Код: Выделить всё
awk "{gsub(/;[^;]*$/,\"\");print}" 1.txt >2.txtвариант на
SED
:Код:
Код: Выделить всё
sed "s/;[^;]*$//g" 1.txt >2.txtP.S. некоторые сборки SED могут некорректно обрабатывать переносы строк, заменяя CRLF -> LF
-
amel27
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
до кучи, вариант штатными средствами (увы, только посимвольно):
Код:
Код:
Код: Выделить всё
@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-
hxygen
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
Вдогонку...
Busla,
Цитата hxygen:
т.е. неудаляем;не удаляем;здесь удаляем весь текст после ; и точку с запятой тоже
Я понял это как строки вида aaa;bbb;ccc переделать в aaa;bbb
hxygen, ну а если нужна рекурсия,то
Код:
Ограничения: пустые строки удаляются; строка не должна содержать символ "!", иначе будут "сюрпризы"

Busla,
Цитата hxygen:
т.е. неудаляем;не удаляем;здесь удаляем весь текст после ; и точку с запятой тоже
CMD/BAT - [решено] Удалить все знаки в строке после ;
Я понял это как строки вида 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
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
Цитата El Sanchez:
ну а если нужна рекурсия
интересный подход, вариация на ту же тему, но без рекурсии:
Код:
ограничения данной реализации:
- удаляются пустые строки
- удаляются множественные ";" (";;;" -> ";")
- удаляются символы "!"/ текст между "!"
ну а если нужна рекурсия
CMD/BAT - [решено] Удалить все знаки в строке после ;
интересный подход, вариация на ту же тему, но без рекурсии:
Код:
Код: Выделить всё
@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)ограничения данной реализации:
- удаляются пустые строки
- удаляются множественные ";" (";;;" -> ";")
- удаляются символы "!"/ текст между "!"
-
amel27
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
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-
rapbit90
Re: CMD/BAT - [решено] Удалить все знаки в строке после ;
Цитата rapbit90:
Можно тоже самое, только чтобы удалял текст ДО ИСКОМОГО СЛОВА ?
...если речь о том же, о чём в первом посте - удалить текст в каждой строке:
Код:
Можно тоже самое, только чтобы удалял текст ДО ИСКОМОГО СЛОВА ?
CMD/BAT - [решено] Удалить все знаки в строке после ;
...если речь о том же, о чём в первом посте - удалить текст в каждой строке:
Код:
Код: Выделить всё
@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