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

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

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

Author24 — интернет-сервис помощи студентам
Народ, помогите с батником. Начал учиться писать .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
4339 / 2129 / 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
4339 / 2129 / 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
4339 / 2129 / 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
Сообщений: 38
04.02.2020, 11:00
Цитата Сообщение от bidstrup Посмотреть сообщение
xml ed -u "//SUSR1/text()" -v ""  file.xml
Как я понял, это замена строки в файле file.xml. Но у меня почему то только в консоли показывает изменения, в файл почему то изменения не записываются. Может какой ключ дописать надо?
0
 Аватар для volodin661
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
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
3165 / 1091 / 491
Регистрация: 29.05.2016
Сообщений: 4,525
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 Кб, 135 просмотров)
1
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 4
21.04.2021, 14:17
sed хорошо, но хочется сделать одним файлом, так как неясно на каких компьютерах будет запускаться батник и будет ли там sed вопрос.
0
3165 / 1091 / 491
Регистрация: 29.05.2016
Сообщений: 4,525
21.04.2021, 14:19
Kill-o-Groom, Вы же будете передавать батник на компьютеры. Попутно передайте и sed
0
6653 / 2817 / 1084
Регистрация: 06.06.2017
Сообщений: 9,556
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
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
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
Ответ Создать тему
Новые блоги и статьи
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel подробные расшифровки по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер