Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - Поиск и замена текста в файле

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


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

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


Изменения
Автор: Дмитрий_Кульгейко@vk
Дата: 10-07-2016
Здравствуйте.
Прошу помощи.

Есть файл с именем 1.txt в нем последняя строчка заканчивается такими символами "текст::== ))"
Необходимо символы "== ))" перенести на новую строчку, т.е. вставить перенос строки <CR><LF>
Текст в кодировке ANSI.
Как это сделать с помощью bat файла?

Пробую следующее, не работает:

setlocal enabledelayedexpansion

Set "infile=D:\1.txt"
Set "find="== ))""
Set "replace=\n"== ))""

@echo off

setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>1.txt
)
move 1.txt %infile%le%

Отправлено: 18:51, 10-07-2016

 

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


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

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


To: alpap

Действительно моя ошибка. Теперь работает.

Но как теперь применить данный код ко всем подобным файлам т.е. файлы в названии имеют маску ma2_годмесяц_день.txt

При подставленный set "f=ma2_*.txt" не находит путь.

Отправлено: 11:13, 11-07-2016 | #11



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

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


Ветеран


Contributor


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

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


Дмитрий_Кульгейко@vk, Предчувствия меня не обманули , замените кусок кода из моего предыдущего поста, и будет Вам желаемое:
Код: Выделить весь код
@Echo Off

	Set "Sep===))"
	Set /A NSep=4
	Set "FName=ma2_*.txt"

SetLocal EnableExtensions EnableDelayedExpansion
For  %%f IN ("%FName%") DO Call :ReLast "%%f"
GoTo :Eof
FName может быть указан и полным путём, например,
Set "FName=C:\ku-ku\tra la la\ma2_*.txt"
И далее как в предыдущем посте
Код: Выделить весь код
:ReLast

Del "%~1.tmp" 2>nul
 
Set "Str="
FOR /F "usebackq delims=" %%s IN (`type "%~1"`) DO (
	If Not "!Str!"=="" >>"%~1.tmp" Echo !Str!
	Set "Str=%%s"
)
If Not "!Str:~-%NSep%!"=="%Sep%" Del "%~1.tmp" 2>nul & GoTo :Eof
If "!Str:~0,-%NSep%!"=="" Del "%~1.tmp" 2>nul & GoTo :Eof 

>>"%~1.tmp" Echo !Str:~0,-%NSep%!
>>"%~1.tmp" Echo !Str:~-%NSep%!
Move /Y "%~1.tmp" "%~1" >nul
GoTo :Eof
А если файлы и переименовать нужно
как в Вашей предыдущей теме
Код: Выделить весь код
@Echo Off

	Set "Sep===))"
	Set /A NSep=4
	Set "FName=ma2_?????_??.txt"
	Set "Pref=12345_5_"

SetLocal EnableExtensions EnableDelayedExpansion
For  %%f IN ("%FName%") DO Call :ReLast "%%f"
GoTo :Eof

:ReLast

Del "%~1.tmp" 2>nul
 
Set "Str="
FOR /F "usebackq delims=" %%s IN (`type "%~1"`) DO (
	If Not "!Str!"=="" >>"%~1.tmp" Echo !Str!
	Set "Str=%%s"
)
If Not "!Str:~-%NSep%!"=="%Sep%" Del "%~1.tmp" 2>nul & GoTo :Eof
If "!Str:~0,-%NSep%!"=="" Del "%~1.tmp" 2>nul & GoTo :Eof 

>>"%~1.tmp" Echo !Str:~0,-%NSep%!
>>"%~1.tmp" Echo !Str:~-%NSep%!

Set "Name=%~n1"
Set "Name2=0!Name:~8,-3!"
Set "Name=%Pref%!Name:~6,2!!Name2:~-2!!Name:~-2!%~x1"

Move /Y "%~1.tmp" "%~dp1%Name%" >nul
If Exist "%~dp1%Name%" echo Del "%~1"  
GoTo :Eof
Если уберёте echo, то исходный файл будет удалён

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-07-2016 в 12:43.

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

Отправлено: 11:50, 11-07-2016 | #12


Ветеран


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

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


Дмитрий_Кульгейко@vk,
для моего кода изменения такие:
Код: Выделить весь код
@echo off
set "d=C:\papka"
for /f "delims=" %%A in ('dir/a-d/b "%d%\ma2_*.txt"') do (
 <"%%A">$ (
  for /f "delims=" %%a in ('more') do @(
   echo %%a|>nul findstr/ec:"==))" && (
    for /f "tokens=1* delims==" %%b in ("%%~a") do @(
     echo %%b
     echo ==%%c
    )
   ) || (
    echo %%a
   )
  )
 )
 move $ "%d%\%%A"
)
exit
или используйте лучше код megaloman, удобнее.

Последний раз редактировалось alpap, 11-07-2016 в 14:02.

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

Отправлено: 12:58, 11-07-2016 | #13


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


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

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


To: megaloman
Ура все работает. Спасибо всем за помощь.

To: alpap
Ваш код тоже работает, но результат сохраняет в файле с именем %A

Посоветуйте книгу по написанию кода в cmd/bat.

Отправлено: 13:34, 11-07-2016 | #14


Ветеран


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

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


Цитата Дмитрий_Кульгейко@vk:
но результат сохраняет в файле с именем %A »
исправил.

Цитата Дмитрий_Кульгейко@vk:
Посоветуйте книгу по написанию кода в cmd/bat. »
самый лучший вариант изучить, это делать какой-нибудь серьезный проект и задавать попутно вопросы по форумам - точно научишься, а вообще информации на форуме + справка (очень не плохая) вполне достаточно изучить основное, а вглубь и литература не поможет, надо чтобы кто-то разжевывал, так везде.

Отправлено: 14:03, 11-07-2016 | #15


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


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

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


Спасибо.

Отправлено: 17:51, 12-07-2016 | #16


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


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

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


alpap, спасибо буду учится.

megaloman, файлы действительно и переименовать надо было )))

По старому вопросу с датой в названии 316546, есть момент.
День оказывается тоже может состоять как из двух цифр, так и из одной.

Отправлено: 18:42, 12-07-2016 | #17


Ветеран


Contributor


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

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


Исправляю погрешности постановки: В имени файла день или месяц могут быть любыми (одно или двузначными)
Код: Выделить весь код
@Echo Off

	Set "Sep===))"
	Set /A NSep=4
	Set "FName=D:\Delete\ma2_*_*.txt"
	Set "Pref=12345_5_"

SetLocal EnableExtensions EnableDelayedExpansion
For  %%f IN ("%FName%") DO Call :ReLast "%%f"
GoTo :Eof

:ReLast

Del "%~1.tmp" 2>nul
 
Set "Str="
FOR /F "usebackq delims=" %%s IN (`type "%~1"`) DO (
	If Not "!Str!"=="" >>"%~1.tmp" Echo !Str!
	Set "Str=%%s"
)
If Not "!Str:~-%NSep%!"=="%Sep%" Del "%~1.tmp" 2>nul & GoTo :Eof
If "!Str:~0,-%NSep%!"=="" Del "%~1.tmp" 2>nul & GoTo :Eof 

>>"%~1.tmp" Echo !Str:~0,-%NSep%!
>>"%~1.tmp" Echo !Str:~-%NSep%!

FOR /F "usebackq tokens=2,3 delims=_" %%s IN ('%~n1') DO Set "YYYYMM=%%s" & Set "DD=0%%t"
Set "MM=0!YYYYMM:~4,2!
Set "Name=%~dp1%Pref%!YYYYMM:~2,2!!MM:~-2!!DD:~-2!%~x1"

move /Y "%~1.tmp" "!Name!" >nul
If Exist "!Name!" Del "%~1" 2>nul
GoTo :Eof
Путь подправьте (или уберите) в маске

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 12-07-2016 в 19:56.

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

Отправлено: 19:28, 12-07-2016 | #18


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


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

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


Откорректировал год в двухзначный, не уверен что правильно, но работает )) получил:
Скрытый текст

@Echo Off

Set "Sep==)"
Set /A NSep=4
Set "FName=c:\TEMP\ma2_*_*.pdf"
Set "Pref=12345_5_"
Set "NewExt=.txt"

SetLocal EnableExtensions EnableDelayedExpansion
For %%f IN ("%FName%") DO Call :ReLast "%%f"
GoTo :Eof

:ReLast

Del "%~1.tmp" 2>nul

Set "Str="
FOR /F "usebackq delims=" %%s IN (`type "%~1"`) DO (
If Not "!Str!"=="" >>"%~1.tmp" Echo !Str!
Set "Str=%%s"
)
If Not "!Str:~-%NSep%!"=="%Sep%" Del "%~1.tmp" 2>nul & GoTo :Eof
If "!Str:~0,-%NSep%!"=="" Del "%~1.tmp" 2>nul & GoTo :Eof

>>"%~1.tmp" Echo !Str:~0,-%NSep%!
>>"%~1.tmp" Echo !Str:~-%NSep%!

FOR /F "usebackq tokens=2,3 delims=_" %%s IN ('%~n1') DO Set "YYYYMM=%%s" & Set "DD=0%%t"
Set "MM=0!YYYYMM:~4,2!
Set "Name=%~dp1%Pref%!YYYYMM:~2,2!!MM:~-2!!DD:~-2!%NewExt%"

move /Y "%~1.tmp" "!Name!" >nul
If Exist "!Name!" Del "%~1" 2>nul
GoTo :Eof

Отправлено: 19:50, 12-07-2016 | #19


Ветеран


Contributor


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

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


Дмитрий_Кульгейко@vk, Извините, забыл что год на выходе двузначный, в предыдущем посте я его исправил, в другой теме сейчас тоже сделаю, чтобы не плодить лишние посты

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 19:57, 12-07-2016 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Сложная замена текста в файле niverprof Скриптовые языки администрирования Windows 11 22-12-2014 11:45
CMD/BAT - BAT поиск текста в файле с условием rosalin Скриптовые языки администрирования Windows 10 05-05-2014 14:56
VBS/WSH/JS - [решено] замена текста в файле по шаблону dembel_zone Скриптовые языки администрирования Windows 12 29-12-2013 19:21
CMD/BAT - Поиск и удаление текста в файле ajakzs Скриптовые языки администрирования Windows 6 18-10-2012 09:18
[решено] Поиск и замена текста в файле TERMINAL AutoIt 6 16-03-2011 17:49




 
Переход