PDA

Показать полную графическую версию : [решено] Поиск замена текста


Страниц : [1] 2

csp
25-03-2012, 01:39
гм неполистал форум прошу прощения на следующей страницы похожая тема. если не выйдет. отпишу нижу

Starter1
25-03-2012, 11:45
Set infile=1.txt
Set find=config
Set replace=parametr

setlocal enabledelayedexpansion
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set LINE=!LINE:%find%=%replace%!
@echo !LINE!>>2.txt
)
endlocal

Ну тут думаю всё понятно. Ищу в файле 1.txt выражение config, а как найду то поменяю его на parametr.

Den
27-03-2012, 16:47
добрый день!
у меня похожая задача только нужно заменить в исходном файле 1.тхт все буквы а на буквы о
извините заранее в этой области я новичок

форум классный! всем удачи

ferget
27-03-2012, 17:14
так и заменяйте


Set find=a
Set replace=o

Den
27-03-2012, 20:47
спасибо! работает!

adamic
26-07-2016, 16:30
а как пользоваться этим скриптом скажите плииз :help:

Iska
26-07-2016, 17:10
а как пользоваться этим скриптом скажите плииз »
Что именно вызывает у Вас затруднение?

user2e@vk
09-09-2016, 12:23
здравствуйте, а как сделать, чтоб изменился текст в файле и пересохранился этот файл, сейчас скрипт делает копию.

x0r
09-09-2016, 14:46
Есть скрипт, чужой, для поиска и замены, правда на VBS для TotalCommander.

'
'Скрипт, заменяющий все вхождения заданной строки во всех выделенных файлах на другую строку. Архиполезнейшая вещь!
'
'=========================[ Start of file ]=========================
' File: ReplaceInFiles.vbs
' Description: Производит поиск текста с заменой
' в выделенных текстовых файлах
' Installation: Создайте кнопку на панели TC
' Команда: "диск:\путь\к\файлу\ReplaceInFiles.vbs"
' Параметры: "%L" (именно в кавычках!)
' Copyright: (c) 2006, Volniy

Option Explicit

Dim FSO, Find_String, Replace_String, F, Buffer, ListFile
Const ForReading = 1, ForWriting = 2

Set FSO = CreateObject("Scripting.FileSystemObject")

Find_String = InputBox("Введите искомую строку", "Поиск и замена")
If Len(Find_String) = 0 Then
MsgBox "Не задана строка поиска!", vbExclamation, "Поиск и замена"
WScript.Quit()
End If

Replace_String = InputBox("Введите строку для замены", "Поиск и замена")

Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
Do While Not ListFile.AtEndOfStream
Call DoItForThisFile(ListFile.ReadLine)
Loop
ListFile.Close
Set ListFile = Nothing
Set F = Nothing
Set FSO = Nothing

MsgBox "Замена завершена!", vbInformation, "Поиск и замена"
WScript.Quit

Sub DoItForThisFile(FilePath)
Set F = FSO.OpenTextFile(FilePath, ForReading)
Buffer = F.ReadAll
F.Close

Buffer = Replace(CStr(Buffer), Find_String, Replace_String, 1, -1, 1)
FSO.CopyFile FilePath, FilePath & ".bak"

Set F = FSO.OpenTextFile(FilePath, ForWriting)
F.Write Buffer
F.Close
End Sub
'=========================[ End of file ]=========================

Iska
09-09-2016, 15:44
здравствуйте, а как сделать, чтоб изменился текст в файле и пересохранился этот файл, сейчас скрипт делает копию. »
Используйте две команды «ren» — для переименования оригинала в *.bak, и последующего переименования нового файла в оригинал.

Akella2007
06-12-2017, 17:46
помогите, пожалуйста решить этот вопрос
http://forum.oszone.net/post-2782789.html#post2782789

спасибо

UncleD
17-07-2019, 13:16
Что-то пошло не так. Нужно в текстовом файле найти текст "ПоказательТипа=0" и заменить его на "ПоказательТипа=", но после выполнения скрипта

Set infile=1.txt
Set find=ПоказательТипа=0
Set replace=ПоказательТипа=

setlocal enabledelayedexpansion
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set LINE=!LINE:%find%=%replace%!
@echo !LINE!>>2.txt
)
endlocal
получаю в файле "0=ПоказательТипа==0", так понимаю, что это из-за того что интерпритатор считает "=" служебным символом, а не текстом. Пробовал заключать все значение в кавычки и экранировать "^=", результат тот же или никакой. Как заставить интерпретатор воспринимать всю строку как текстовое выражение?

megaloman
17-07-2019, 15:39
@Echo Off
cls
Set "FileIn=Z:\Где файл\1.txt"
Set "Fin=ПоказательТипа=0"
Set "Rep=ПоказательТипа="

mshta vbscript:execute("Set FSO = CreateObject(""Scripting.FileSystemObject"") : Set FF = FSO.OpenTextFile(""%FileIn%"", 1) : InTxt = FF.ReadAll : FF.Close : Set FF = FSO.OpenTextFile(""%FileIn%"", 2, True) : FF.Write Replace(InTxt, ""%Fin%"", ""%Rep%"") : FF.Close :close")
Pause
Exit /B
1.txt должен быть в кодировке 1251
Чтобы решить задачу для конкретного построения файла средствами CMD прикрепите к сообщению Ваш файл 1.txt, надо понимать, например, текст "ПоказательТипа=0" единственный в строке или он внутри другого текста, есть ли другие строки, содержащие =, есть ли строки без =

UncleD
18-07-2019, 08:25
1.txt должен быть в кодировке 1251 »
Видимо потому сходу и не отработал, но пока менять ничего не пытался.
Чтобы решить задачу для конкретного построения файла средствами CMD прикрепите к сообщению Ваш файл 1.txt, надо понимать, например, текст "ПоказательТипа=0" единственный в строке или он внутри другого текста, есть ли другие строки, содержащие =, есть ли строки без = »
Прикрепляю. Это суть есть выгрузка платежных поручений из 1С, но банк клиент не хавает одну эту строчку в исходном виде. Строчка эта есть не в каждой платежке, ну и не в каждой секции документа соответственно. Для примера оставил только три документа, нужная строка есть только в секции первого.

megaloman
18-07-2019, 10:18
UncleD, Основываясь на Вашем файле, задачу формулирую так:
Есть текстовый файл без пустых строк в 1251 (Windows) кодировке.
Надо заменить в файле строку с указанным текстом на другую.@Echo Off
cls
>NUL Chcp 1251

Set "FileIn=Z:\Где файл\11.txt"
Set "Find=ПоказательТипа=0"
Set "Repl=ПоказательТипа="

Set /A NN=1000000, N=0
FOR /F "usebackq tokens=1* delims=:" %%i IN (`2^>nul FINDSTR /R /N /C:".*" "%FileIn%"`) DO (
Set /A N=%NN%+%%i &Call Set "@@@%%N%%=%%j"
)
FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i IN (`2^>nul Find /I /N "%Find%" "%FileIn%"`) DO (
Set /A M=%NN%+%%i &Call Set "@@@%%M%%=%Repl%"
)
>"%FileIn%" (FOR /L %%a IN (1000001,1,%N%) DO Call Echo %%@@@%%a%%)
Pause
GoTo :EofМоё предыдущее решение делает более общую задачу: ищется указанный текст, и не важно, где он расположен, в том числе и внутри строки, и меняется именно текст, а не строка. Он более устойчив ко всяким служебным для CMD символам в тексте. Дублирую его в минимально изменённом виде:@Echo Off
cls
>nul Chcp 1251
Set "FileIn=Z:\Где файл\11.txt"
Set "Fin=ПоказательТипа=0"
Set "Rep=ПоказательТипа="

mshta vbscript:execute("Set FSO = CreateObject(""Scripting.FileSystemObject"") : Set FF = FSO.OpenTextFile(""%FileIn%"", 1) : InTxt = FF.ReadAll : FF.Close : Set FF = FSO.OpenTextFile(""%FileIn%"", 2, True) : FF.Write Replace(InTxt, ""%Fin%"", ""%Rep%"") : FF.Close :close")
Pause
Exit /B
Чтобы не было никакой путаницы с кодировками, оба этих скрипта должны быть написаны в 1251 (Windows) кодировке.

Постскриптум: Обнаружил, что первый скрипт из приведенных (чистый CMD) Вам не годится из-за наличия в тексте служебных для CMD символов. Например: в 80 строке пропадает %. Какие еще извращения возможны- не берусь судить, поэтому наилучший вариант Скрипт.VBSFileIn = "Z:\Где файл\11.txt"
Fin = "ПоказательТипа=0"
Rep = "ПоказательТипа="

Set FSO = CreateObject("Scripting.FileSystemObject")
Set FF = FSO.OpenTextFile(FileIn, 1)
InTxt = FF.ReadAll
FF.Close

Set FF = FSO.OpenTextFile(FileIn, 2, True)
FF.Write Replace(InTxt, Fin, Rep)
FF.Close

UncleD
18-07-2019, 15:26
megaloman, спасибо, все сработало.
В итоге воспользовался вторым вариантом, то есть этим:
@Echo Off
cls
>nul Chcp 1251
Set "FileIn=Z:\Где файл\11.txt"
Set "Fin=ПоказательТипа=0"
Set "Rep=ПоказательТипа="

mshta vbscript:execute("Set FSO = CreateObject(""Scripting.FileSystemObject"") : Set FF = FSO.OpenTextFile(""%FileIn%"", 1) : InTxt = FF.ReadAll : FF.Close : Set FF = FSO.OpenTextFile(""%FileIn%"", 2, True) : FF.Write Replace(InTxt, ""%Fin%"", ""%Rep%"") : FF.Close :close")
Pause
Exit /B
Единственно убрал Pause, чтобы скрипт не ждал эникея и еще /B, ведь если я правильно понял, то он нужен в случае, когда мой скрипт вызывал бы еще один или я что-то путаю?
Еще нашел в сети vbs, через который вызываю свой батник, а он прячет окно командной строки, ну просто чтобы не пугать пользователя регулярно выскакивающими непонятками, хотя решение и не очень элегантное.
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "replace.bat" & Chr(34), 0
Set WshShell = Nothing
После отработки скрипта на всякий случай сравнил в Ворде исходный и итоговый файл, он других отличий кроме отсутствующего нуля он не нашел.
Еще раз благодарю.

megaloman
18-07-2019, 15:35
UncleD, нормальные герои всегда идут в обход? :lol: Почему сразу не запускать vbs-вариант? СкрипачБатник не нужен. Или Вы что-то не договариваете? Например, надо в скрипт имя файла передавать?

UncleD
19-07-2019, 08:01
Например, надо в скрипт имя файла передавать? »
Ага, жуть как стесняюсь признаться что ничерта в этом не понимаю и не знаю как это в один скрипт объединить)

UncleD
19-07-2019, 12:24
Вас надо уговаривать, или сами подробно расскажите задачу? Что надо сделать? »
Уговорили). Есть Бухгалтер работающий с интернет клиентом банка, ему нужно туда выгружать платежки из 1С, она в свою очередь выгружает их в текстовый файл, часть которого я скидывал раньше. После перехода с обычного установленного банк-клиента на онлайн версию, часть платежек начала отклоняться. Как выяснилось, причина в этой строке, той что "ПоказательТипа=0" в новых версиях нет и не должно быть "0". Лезть в конфу 1С без малейшего понимания, чтобы исправить формат выводимого файла там, нет никакого желания, так что решил пойти более менее понятным мне путем с батником в планировщике, который будет с некоторой периодичностью заменять эту строку в уже выгруженном файле, чтобы бух потм мог спокойно скормить его банку. Если закинуть батник в планировщик как есть, то при его выполнении на экране выскакивает черное окно консоли, согласитесь некрасиво, вот потому и искал способ это окно убрать, нашел и применил в меру своих познаний.

megaloman
19-07-2019, 13:55
UncleD, откуда берётся имя файла? И в чём затруднение вставить vbs скрипт в планировщик, вроде Вы это можете?
Вот доработка vbs-скрипта c целью исключения перезаписи входного файла в случае, если строка для замены не найдена (то есть, на практике, ранее эта замена уже планировщиком была сделана)FileIn = "Z:\Где файл\11.txt"
Fin = "ПоказательТипа=0"
Rep = "ПоказательТипа="

Set FSO = CreateObject("Scripting.FileSystemObject")
Set FF = FSO.OpenTextFile(FileIn, 1)
InTxt = FF.ReadAll
FF.Close

If InStr(1, InTxt, Fin) <> 0 Then
Set FF = FSO.OpenTextFile(FileIn, 2, True)
FF.Write Replace(InTxt, Fin, Rep)
FF.Close
End If




© OSzone.net 2001-2012