С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/347: Рейтинг темы: голосов - 347, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 11

Замена текста в файле

16.04.2018, 17:30. Показов 67142. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, помогите с батником. Начал учиться писать .bat для себя. В итоге столкнулся с необходимостью bat на работе... Ну вот как написать нужный мне не могу понять... В инете есть похожие статьи, но не совсем то, что нужно мне.
Смысл батника таков:
Есть файл: К0000.*** (Первая часть К0000 остается неизменной, а вот .*** меняется).
Мне нужно сл.: чтоб он находил файл в директории, открывал его и заменял в тексте значения.

Допустим текст такой:

342342532532542542А03423523523523523
231434213413413421А1234232342А032423423423423

После обработки батником текст должен быть сл.

342342532532542542003423523523523523
231434213413413421002342323420032423423423423

т.е. среди множества цифр есть А1 и А0, он должен при совпадении А1 или А0 менять их на 00.

Второе условие, что он их должен менять только при полном совпадении, т.е. 123456789А9 - не подходит, 123456789А0 - подходит.

Просьба, Вы можете полностью описать процесс? Очень хотелось бы понять на примере, чтоб дальше писать самому.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2018, 17:30
Ответы с готовыми решениями:

Поиск и замена текста в файле
Имеется, допустим, файлик в кодировке 1251: tyutuyt бухгалтера лросодло клиентов апорпвоыпоп ываываыаыва Нужно как-то заменить...

Замена текста в файле
добрый вечер. есть файл вида: #example.sln Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 ...

Замена текста в тхт файле
Добрый день! Помогите отредактировать файл. Есть текстовик c 100500 строками, нужно в каждой строке убрать весь текст между двумя символами...

23
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
17.04.2018, 11:58
Лучший ответ Сообщение было отмечено Topirka как решение

Решение

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
<file.txt>tmp (for /f "delims=" %%a in ('more') do @<nul set /p="%%a"|>nul findstr /r /c:"A[01]" && (
  set "vs=%%a"& call :ps
 ) || (
  echo:%%a
 )
)& >nul move tmp file.txt
pause& exit
 
:ps
 @set "vs=%vs:A0=00%"
 @set "vs=%vs:A1=00%"
 @echo %vs%
exit /b
До:

После:
1
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 11
17.04.2018, 13:42  [ТС]
Работает идеально)
А можно Вас попросить описать процесс? За что отвечает каждая из?

А как сделать, чтоб он перезаписывал файл? Чтоб не создавалось нового .txt документа?

Возможно чтоб он искал сам в этой папке файл допустим M1234.***? Есть есть файл M1234. то он сам его берет, там из-за расширения только номер меняется. М1234 не меняется.

Буду очень благодарен если полностью опишите процесс, чтоб понимать что и к чему.Так проще учиться. Большое Вам спасибо!
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
17.04.2018, 15:13
Цитата Сообщение от Topirka Посмотреть сообщение
чтоб он перезаписывал файл
это и происходит или я вас не понимаю.

Цитата Сообщение от Topirka Посмотреть сообщение
искал сам в этой папке файл M1234...
Windows Batch file
1
for /f "delims=" %%a in ('dir /a-d/b "Papka\M1234*"') do echo %%a
или
Windows Batch file
1
for /f "delims=" %%a in ('dir /a-d/b "Papka\*"^|find "M1234"') do echo %%a
Цитата Сообщение от Topirka Посмотреть сообщение
если полностью опишите процесс, чтоб понимать что и к чему
200% на то что после этого ничего не поймете, если бы так быстро все давалось все были бы программистами давно и форум был бы не нужен.
1
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 11
17.04.2018, 16:29  [ТС]
Цитата Сообщение от alpap Посмотреть сообщение
это и происходит или я вас не понимаю.
нет, он создает новый файл file.txt и в него перезаписывает. Возможно ли чтоб он правил существующий файл? А то из за этого и время работы батника около минуты.

Цитата Сообщение от alpap Посмотреть сообщение
1
for /f "delims=" %%a in ('dir /a-d/b "Papka\M1234*"') do echo %%a
Видимо я совсем еще новичок, потому что не особо понимаю за место чего это вставить

Добавлено через 48 минут
Цитата Сообщение от alpap Посмотреть сообщение
1
for /f "delims=" %%a in ('dir /a-d/b "Papka\*"^|find "M1234"') do echo %%a
Все перепробовал, файлы находит, но не обрабатывает.. наверно что-то не туда вставляю...

Добавлено через 4 минуты
Цитата Сообщение от Topirka Посмотреть сообщение
это и происходит или я вас не понимаю.
Перезапись просто удобна тем, что в случае чего, он не перезатирает прошлый файл. Допустим отработал один файл, затем второй. В итоге 2 файла, а не 1.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
17.04.2018, 16:47
Лучший ответ Сообщение было отмечено Topirka как решение

Решение

Цитата Сообщение от Topirka Посмотреть сообщение
не перезатирает прошлый файл
по другому bat не умеет

Цитата Сообщение от Topirka Посмотреть сообщение
наверно что-то не туда вставляю...
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
for /f "delims=" %%a in ('dir /a-d/b "Papka\M1234*"') do <"%%a">tmp (
 for /f "delims=" %%f in ('more') do @<nul set /p="%%f"|>nul findstr /r /c:"A[01]" && (
   set "vs=%%f"& call :ps
  ) || (
   echo:%%f
  )
 )
)
>nul move tmp file.txt
pause& exit
 
:ps
 @set "vs=%vs:A0=00%"
 @set "vs=%vs:A1=00%"
 @echo %vs%
exit /b
Добавлено через 2 минуты
подобные вещи на bat - извращение, как раз все выше это и демонстрирует.
1
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 11
17.04.2018, 16:53  [ТС]
Цитата Сообщение от alpap Посмотреть сообщение
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
for /f "delims=" %%a in ('dir /a-d/b "Papka\M1234*"') do <"%%a">tmp (
*for /f "delims=" %%f in ('more') do @<nul set /p="%%f"|>nul findstr /r /c:"A[01]" && (
* *set "vs=%%f"& call :ps
* ) || (
* *echo:%%f
* )
*)
)
>nul move tmp file.txt
pause& exit
:ps
*@set "vs=%vs:A0=00%"
*@set "vs=%vs:A1=00%"
*@echo %vs%
exit /b
Не, просто в этом случае он правит непосредственно в самом фале....

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
setlocal enabledelayedexpansion
 
rem имя файла
Set infile= M12345.*
 
rem ищем это
Set find=A0
 
rem меняем на это
Set replace=00
 
@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!>>tmp.txt
)
move tmp.txt %infile%
pause
0
0 / 0 / 0
Регистрация: 19.07.2016
Сообщений: 3
20.07.2018, 20:58
Ребят, перерыл весь инет, в некоторых местах два раза, найти именно то что нужно не могу.

Задача такая - есть файл с примерно таким содержанием:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
<SUSR1>12131212</SUSR1>
 
<PRIORITY>3</PRIORITY>
 
<ROUTE>34_DN_ZPO</ROUTE>
 
<C_ADDRESS1>456544456446</C_ADDRESS1>
 
<C_ADDRESS2>788987789</C_ADDRESS2>
 
<C_ADDRESS3/>
 
<C_ADDRESS4/>
Мне нужно стереть "цифры" между суср и адресами (вместо цифр там всё что угодно - проблемы, верхние кавычки и прочеее), и сохранить файл.

Целая куча как найти один текст и подменить другим, но вот такое найти в упор не могу. Регулярными выражениями тоже не сообразил как. Подскажите кому сколько не жалко.

Спасибо.
0
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
21.07.2018, 06:51
XMLStarlet- это известная утилита командной строки, которую можно использовать для
  • преобразования
  • запроса содержимого
  • проверки
  • редактирования
XML-документов.
( https://sourceforge.net/projects/xmlstar/files/ )
Установка проста, после распаковки добавить в PATH каталог, где находится xml.exe

сначала проверка на то, что твой обрабатываемый файл является правильным XML-файлом ( validation ).
Windows Batch file
1
xml val file.xml
Если всё в порядке,
производим удаление текста, относящегося к узлу SUSR1
Windows Batch file
1
xml ed -L -d "//SUSR1/text()"  file.xml
1
0 / 0 / 0
Регистрация: 19.07.2016
Сообщений: 3
21.07.2018, 08:56
Вариант рабочий, но боюсь в моём случае закрытый "узел" (/) и пустой (><) немного разные вещи. Попробую скормить программе этот вариант, но если не получится есть ли варианты именно с тупым вытиранием текста между тегов?

И раз уж такая пьянка - можно ли увидеть в батнике что он сделал? Вывести лог или как было\стало после его выполнения?
0
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
21.07.2018, 09:30
Цитата Сообщение от cahbe Посмотреть сообщение
И раз уж такая пьянка - можно ли увидеть в батнике что он сделал?
Да, конечно, достаточно убрать ключ -L ( in-place editing ) и результат пойдёт в stdout, то есть, в консольное окно.

Цитата Сообщение от cahbe Посмотреть сообщение
Вариант рабочий, но боюсь в моём случае закрытый "узел" (/) и пустой (><) немного разные вещи.
Вообще-то это одно и то же, но ... Но вполне возможно, что можно заставить xmlstarlet с помощью настроек генерить пустой узел так, как тебе хочется.

Добавлено через 5 минут
Если оп.система Windows 7 и свежее, порекомендовал бы использовать powershell в качестве универсального инструмента для работы
с текстовыми файлами всех видов ( txt, rtf, csv, html, xml ... ).

Добавлено через 17 минут
Вместо ключа -d (удалить), можно использовать ключ -u(изменить) и тогда,
подсунув ключу -v пустые кавычки, получим желаемое: <SUSR1></SUSR1>
Windows Batch file
1
xml ed -u "//SUSR1/text()" -v ""  file.xml
2
2 / 2 / 0
Регистрация: 22.11.2017
Сообщений: 39
04.02.2020, 11:00
Цитата Сообщение от bidstrup Посмотреть сообщение
xml ed -u "//SUSR1/text()" -v ""  file.xml
Как я понял, это замена строки в файле file.xml. Но у меня почему то только в консоли показывает изменения, в файл почему то изменения не записываются. Может какой ключ дописать надо?
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,829
04.02.2020, 13:05
Цитата Сообщение от bidstrup Посмотреть сообщение
Да, конечно, достаточно убрать ключ -L ( in-place editing ) и результат пойдёт в stdout, то есть, в консольное окно.
Соответственно, добавление ключа -L отредактирует файл по месту. ( xml ed -L -d "//SUSR1/text()" file.xml )
1
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 4
21.04.2021, 13:38
Прошу помочь. Имею файл, в котором средствами cmd нужно заменить строку (или часть сроки) на другую.

Скрипт указанный здесь справляется на отлично:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
setlocal enabledelayedexpansion
 
rem имя файла
Set infile= M12345.*
 
rem ищем это
Set find=A0
 
rem меняем на это
Set replace=00
 
@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!>>tmp.txt
)
move tmp.txt %infile%
pause
но он удаляет переносы строк из оригинального файла. Как переносы строк сохранить?
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
21.04.2021, 14:06
Kill-o-Groom, пробуйте:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
 
rem имя файла
Set infile=M12345.*
 
rem ищем это
Set find=A0
 
rem меняем на это
Set replace=00
 
rem процесс
sed -i "s/%find%/%replace%/" "%infile%"
pause
exit
Для работы скрипта используйте утилиту sed (во вложении)
Вложения
Тип файла: zip sed.zip (208.3 Кб, 140 просмотров)
1
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 4
21.04.2021, 14:17
sed хорошо, но хочется сделать одним файлом, так как неясно на каких компьютерах будет запускаться батник и будет ли там sed вопрос.
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
21.04.2021, 14:19
Kill-o-Groom, Вы же будете передавать батник на компьютеры. Попутно передайте и sed
0
6969 / 2863 / 1100
Регистрация: 06.06.2017
Сообщений: 9,713
21.04.2021, 18:09
Цитата Сообщение от Kill-o-Groom Посмотреть сообщение
средствами cmd
cmd + for тут бесполезны. См. js:
JavaScript
1
2
3
4
5
file = 'M12345.txt'
with (WSH.CreateObject('Scripting.FileSystemObject')){
  text = openTextFile(file).readAll().replace(/A0/g,'00')
  with(openTextFile(file,2)){write(text);close()}
}
0
0 / 0 / 0
Регистрация: 10.05.2015
Сообщений: 60
30.05.2022, 07:02
Здравствуйте, есть следующий скрипт:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
Set infile=%1
Set find=%Param1%
Set replace=%Param2%
setlocal enabledelayedexpansion 
for /F "tokens=* delims=," %%n in (!infile!) do ( 
set LINE=%%n 
set TMPR=!LINE:%find%=%replace%! 
@echo !TMPR!>>tmp.txt 
)
move tmp.txt %infile%
endlocal
Скажем, надо найти строку "alpha=4" и заменить строкой "alpha=2". Скрипт просто не обрабатывает это правильно. Если строки брать в кавычки, вообще ничего не заменяет.
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,829
30.05.2022, 16:24
можно приспособить программу exiftool
ZAMENA
Perl
1
2
3
4
5
6
7
8
9
10
$^I = '.saved';
 
while(<>) {
   s/\balpha=4\b/alpha=2/i;
   print;
}
 
print "Dear friend! Your original file(s) saved with '.saved' postfix\n";
 
exit;

Windows Batch file
1
exiftool -config ZAMENA  file1 file2 file3 fileN
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2022, 16:24
Помогаю со студенческими работами здесь

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

Множественная замена текста в файле
Добрый день! Нужно в выбранном файле сделать множественные замены текста (5 переменных со значениями) в разных строках. Нашел пример типа...

Поиск и замена текста в REG-файле
Здравствуйте, помогите пожалуйста написать скрипт имеется файл C:\dir\1.reg нужно в нем найти текст из 2-й строки файла C:\dir\2.txt и...

Замена текста в файле и последующая сортировка строк
Есть файлы с расширением &quot;.n&quot; в папке &quot;c:\1&quot; текстом примерно такого содержания: 1|21424142|12|Иванов Иван Иванович 2|13214142|8|Петров...

Поиск и замена текста в файле, в содержимом которого имеются специальные символы
Поискал в инете, толкового ответа не нашел. Суть вопроса... Есть текстовый файл. При запуске батник предлагается ввести новое значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru