Пакетная замена текста в документах Word
Обновлено: 21.11.2024
Я пишу сценарий пакетного файла, используя среду командной строки Windows, и хочу заменить каждое вхождение некоторого текста в файле (например, "FOO") другим (например, "BAR"). Каков самый простой способ сделать это? Есть встроенные функции?
30 ответов 30
Многие из приведенных здесь ответов помогли мне выбрать правильное направление, однако ни один из них мне не подходил, поэтому я публикую свое решение.
У меня Windows 7 со встроенной оболочкой PowerShell. Вот скрипт, который я использовал для поиска/замены всех экземпляров текста в файле:
- powershell запускает powershell.exe, входящий в состав Windows 7
- -Command ". " – это аргумент командной строки для powershell.exe, содержащий команду для запуска
- (gc myFile.txt) считывает содержимое файла myFile.txt ( gc – это сокращение от команды Get-Content)
- -replace 'foo', 'bar' просто запускает команду replace, чтобы заменить foo на bar
- | Out-File myFile.txt направляет вывод в файл myFile.txt
- -кодировка ASCII предотвращает преобразование выходного файла в Unicode, как указано в комментариях
Powershell.exe уже должен быть частью вашего оператора PATH, но если нет, вы можете добавить его. Его расположение на моем компьютере: C:\WINDOWS\system32\WindowsPowerShell\v1.0
Обновление
По-видимому, современные системы Windows имеют встроенную оболочку PowerShell, позволяющую получить доступ к этому напрямую с помощью
Осторожно, эта команда может также перекодировать файл в кодировку Unicode. Вы можете вручную указать кодировку, добавив -encoding ASCII или UTF8 или что-то еще. Также имейте в виду, что если вы используете кодировку UTF8, в начале файла может появиться метка порядка байтов, которой не было в оригинале.
@Wyck Мне потребовалось некоторое время, чтобы понять, куда поместить -encoding ASCII . Для тех, кому это понадобится в будущем, это будет Out-File -encoding ASCII myFile.txt
Учтите, что токен замены (в данном случае "foo") обрабатывается как регулярное выражение. Если у вас есть какие-либо специальные символы (у меня был [ ] ), вам нужно добавить перед ними символ \ (обратная косая черта).
Я вижу, что PowerShell способен это сделать. Но как мне запустить этот запуск из пакетного файла (пример: myProc.bat)?
При сохранении в тот же файл произойдет сбой с ошибкой «Файл используется». Вам нужно изменить команду powershell на: (Get-Content test.txt) | ForEach-Object < $_ -заменить "foo", "bar" >| Set-Content test.txt
См. ответ @Rachel: powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Только что использовал FART (утилита командной строки «Найти и заменить текст»):
отличное небольшое бесплатное ПО для замены текста в большом наборе файлов.
просмотрит замены, которые необходимо выполнить рекурсивно в файлах этого дистрибутива Perl.
Единственная проблема: значок веб-сайта FART не совсем со вкусом, утонченно или элегантно ;)
Обновление 2017 года (7 лет спустя) – отмечает jagb в комментариях к статье 2011 года Микаила Тунча "FARTing the Easy Way — Find And Replace Text"
Как отметил Джо Джобс в комментариях (декабрь 2020 г.), если вы хотите, например, заменить &A, вам нужно будет использовать кавычки, чтобы убедиться, что & не интерпретируется оболочкой:
Очень легкий и простой в использовании, но я надеялся, что он распечатает точные места замены. Неспособность видеть это вызывала у меня чувство незащищенности.
Спасибо, это прекрасно, должно быть частью стандартных инструментов DOS и работало волшебно. Однако опция -p не показывает, сколько изменений она «будет» делать, и всегда сообщает 0, что отбросило меня на несколько минут
Replace — замена подстроки с помощью подстановки строк. Описание: чтобы заменить подстроку другой строкой, используйте функцию подстановки строк. Показанный здесь пример заменяет все вхождения опечаток "teh" на "the" в строковой переменной str.
Чем предложение sed лучше? Кажется, это самый простой ответ из всех, и ничего не нужно устанавливать.
"Чем предложение sed лучше?" - sed и подобные утилиты работают с файлами; этот фрагмент кода пропускает важный этап чтения строк из входного файла и записи в выходной файл, обеспечивая при этом правильную обработку любых специальных символов в файле.
@Asad, да, это правда, ОП спрашивал о файлах, но на самом деле он работает с потоками, которые не обязательно должны быть файлами. Но я хочу сказать, что этот ответ ошибочен, поскольку он не включает чтение/запись из потока и обработку любых специальных символов.
Создать файл replace.vbs:
Чтобы использовать этот пересмотренный сценарий (который мы назовем replace.vbs), просто введите команду, подобную этой, в командной строке:
cscript replace.vbs "C:\Scripts\Text.txt" "Джим" "Джеймс"
@user280109 Да, VBScript поддерживает RegExp .Вы можете использовать это для замены с помощью регулярного выражения: With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With . Вы можете получить текст первых 9 групп захвата, используя $1 , $2 . 9 долларов США.
VBScript часто упускают из виду (и ненавидят), но он доступен на всех платформах Windows, очень удобен для чтения и на самом деле обладает очень мощными возможностями +1
@user280109 Вы только что дали команду, что мне нужно. Но я хочу заменить (без учета регистра). Можете ли вы предоставить команду для этого?
Спасибо, этот скрипт был великолепен, мне нравится ваш префикс (слова str и obj), я делаю то же самое, он старый, но золотой, он делает код более читабельным.
Он использует комбинацию FOR , FIND и CALL SET .
Строки, содержащие символы среди "&<>]|^, могут быть обработаны неправильно.
Я согласен, что их условия сбивают с толку, они также говорят: «Информация, предоставленная в домене dostips.com, надеюсь, полезна», поэтому я предполагаю, что они рады, что люди копируют код для решения проблемы. Я не уверен, что когда-либо читал какие-либо положения и условия и остался доволен.
Мне также нравятся решения, не использующие внешние утилиты, но, к сожалению, при попытке запустить этот пакет я постоянно получаю сообщение "find: invalid predicate `'". Сейчас нет времени на отладку.
Ошибка "find: недопустимый предикат `"" возникла из-за внешней утилиты "find" в моей системе. После удаления все заработало.
Примечание . Обязательно ознакомьтесь с обновлением в конце этого ответа, чтобы найти ссылку на более высокий JREPL.BAT, который заменяет REPL.BAT
< em>JREPL.BAT 7.0 и выше изначально поддерживает юникод (UTF-16LE) через параметр /UTF, а также любой другой набор символов, включая UTF-8, через ADO.
Я написал небольшую гибридную JScript/пакетную утилиту под названием REPL.BAT, которая очень удобна для изменения файлов ASCII (или расширенных ASCII) с помощью командной строки или пакетного файла. Чисто родной скрипт не требует установки каких-либо сторонних исполняемых файлов и работает в любой современной версии Windows, начиная с XP. Это также очень быстро, особенно по сравнению с чистыми пакетными решениями.
REPL.BAT просто считывает стандартный ввод, выполняет поиск и замену регулярных выражений JScript и записывает результат в стандартный вывод.
Вот простой пример того, как заменить foo на bar в файле test.txt, предполагая, что REPL.BAT находится в вашей текущей папке или, что еще лучше, где-то в вашем PATH:
Возможности регулярных выражений JScript делают его очень мощным, особенно способность замещающего текста ссылаться на захваченные подстроки из текста поиска.
Я включил в утилиту несколько опций, которые делают ее достаточно мощной. Например, сочетание параметров M и X позволяет модифицировать двоичные файлы! Опция M Многострочный позволяет выполнять поиск по нескольким строкам. Параметр шаблона замены X eXtended предоставляет escape-последовательности, которые позволяют включать любое двоичное значение в замещающий текст.
Всю утилиту можно было бы написать как чистый JScript, но гибридный пакетный файл избавляет от необходимости явно указывать CSCRIPT каждый раз, когда вы хотите использовать утилиту.
Это случается со всеми нами: мы набираем документ в Microsoft Word или Excel только для того, чтобы обнаружить, что слово, использованное несколько раз, было неточным или просто неверным. Это момент «Ctrl-F», но если есть много случаев указанной оговорки, вас может ждать утомительная и трудоемкая рутинная работа. Есть лучший способ замены слов в Word и Excel.
Этот лучший способ известен как Replace Genius, и он может вносить эти изменения для вас в пакетном стиле, то есть несколько замен могут быть выполнены одним махом.
Где я могу это получить и сколько это будет стоить?
Для начала перейдите в веб-браузере на сайт RL Vision, где находится нужное программное обеспечение. Здесь вы найдете различную информацию о приложении, а также кнопку «Загрузить».
Это бесплатное приложение, поэтому цена подходит для любого бюджета. Разработчик описывает программное обеспечение как «команду «Найти и заменить» на стероидах».
Что вы получаете
Replace Genius обещает многое, в том числе возможность сохранять часто используемые команды в виде списков «Presets» и «Пакетная замена» для быстрого вызова, возможность работы с текстовыми файлами, документами Word и электронными таблицами Excel, функциями обработки с широкими возможностями настройки и предварительным просмотром в реальном времени, показывающим результат до того, как вы что-либо измените.
Начнем
Поначалу это может показаться немного сложным, но не пугайтесь внешнего вида.Вам не нужно будет использовать свою степень в области компьютерных наук, чтобы работать здесь.
Здесь может быть многое, но мы собираемся сделать это простым, рассмотрев основы замены ряда слов в документе Microsoft Word.
Итак, давайте скопируем и вставим несколько слов из одного из моих предыдущих рассказов в Word и начнем с замены некоторых из этих слов, чтобы мы могли увидеть, как все это работает.
Скопировав первые два абзаца в Word и сохранив их как тестовый документ, можно приступать к работе. Сначала нам нужно запустить «Заменить Genius» и нажать кнопку «Открыть» в крайнем левом углу верхнего меню — имейте в виду, что вам нужно будет закрыть документ Word или опасаться гнева Microsoft, когда вы получите сообщение о том, что документ заблокирован. другой программой. Найдите свой файл и приступайте к работе.
Слово, которое я больше всего заметил в этих двух абзацах, было «это» — примечание моему редактору: клянусь, им не злоупотребляли!
Давайте заменим его на «the» — это сделает формулировку бессмысленной, но в конце концов это всего лишь тест. Вот что нам нужно сделать, чтобы внести это незначительное изменение.
Перейдите на вкладку "Заменить" в левом столбце и заполните два пустых места. В этом случае мы введем «это» в поле «найти» и «то» в поле «и заменить на». Включите «пакетную замену» и нажмите кнопку «Применить», и все будет готово.
Результатом является почти мгновенная замена каждого экземпляра слова. Процесс осуществляется без проблем и хлопот.
Вердикт
По непомерной цене бесплатное приложение стоит того, чтобы на него посмотреть. Если вы являетесь опытным пользователем Office, вы можете использовать это каждый день. Если нет, это все еще удобный инструмент.
Следующий код, если он сохранен в глобальном шаблоне, выполнит поиск и замену всех документов во всех документах в указанной папке. Диалог FindReplace отображается только для первого документа. Пользователь устанавливает параметры в диалоговом окне и нажимает «Заменить все», а затем «Закрыть». Затем пользователя спрашивают, следует ли обрабатывать все файлы в указанном каталоге. Если да, остальные файлы обрабатываются с настройками, введенными в исходном диалоговом окне FindReplace.
Общедоступная подпрограмма BatchReplaceAll()
Затемнить FirstLoop как логическое значение
Затемнить myFile как строку
Затемнить PathToUse как строку
Затемнить myDoc как документ
Затемнить ответ как длинный
'Обработчик ошибок для обработки ошибок, возникающих каждый раз, когда
'диалоговое окно FindReplace закрывается
При ошибке возобновления следующего
'Закрыть все открытые документы перед началом
Documents.Close SaveChanges:=wdPromptToSaveChanges
'Логическое выражение для проверки первого цикла
'Используется для того, чтобы диалоговое окно FindReplace
'отображалось только для первого документа
FirstLoop = True р>
'Установите каталог и тип файла для пакетной обработки
myFile = Dir$(PathToUse & "*.doc")
'Открыть документ
Set myDoc = Documents.Open(PathToUse & myFile)
If FirstLoop Then
'Отображать диалоговое окно только в первом цикле
Dialogs(wdDialogEditReplace).Show
Response = MsgBox("Вы хотите обработать " & _
"остальные файлы в этой папке", vbYesNo)
If Response = vbNo Then Exit Sub
Else
'В последующих циклах (файлах) ReplaceAll
'выполняется с исходными настройками и без
'повторного отображения диалогового окна
< br />With Dialogs(wdDialogEditReplace)
.ReplaceAll = 1
.Execute
End With
'Закрыть измененный документ после сохранения изменений
myDoc.Close SaveChanges:=wdSaveChanges
'Следующий файл в папке
myFile = Dir$()
Если есть вероятность, что некоторые файлы могут быть защищены паролем, см. также: Пропуск документов, защищенных паролем, в пакетном процессе.
Общедоступная подпрограмма BatchReplaceAll()
Затемнить FirstLoop как логическое значение
Затемнить myFile как строку
Затемнить PathToUse как строку
Затемнить myDoc как документ
Затемнить ответ As Long
Dim i As Long
'Обработчик ошибок для обработки ошибок, возникающих всякий раз, когда
'диалоговое окно FindReplace закрывается
При ошибке возобновить следующий
'Закрыть все открытые документы перед началом
/>
Documents.Close SaveChanges:=wdPromptToSaveChanges
'Логическое выражение для проверки первого цикла
'Используется для того, чтобы диалоговое окно FindReplace
'отображалось только для первого документа
FirstLoop = True р>
'Установите каталог и тип файла для пакетной обработки
С приложением.FileSearch
.NewSearch
.LookIn = PathToUse
.SearchSubFolders = True
.FileName = "*.doc"
.MatchTextExactly = True
.FileType = мсофилетипеаллфилес
Если .Выполнить() То
Для i = 1 To .FoundFiles.Count
'Открыть документ
Set myDoc = Documents.Open(.FoundFiles(i))
Если первый цикл, то
'отображать диалоговое окно только в первом цикле
Response = MsgBox("Вы хотите обработать " & _
"остальные файлы в этой папке", vbYesNo)
If Response = vbNo Then Exit Sub
'В последующих циклах (файлах) ReplaceAll
'выполняется с исходными настройками и без
'повторного отображения диалогового окна
С диалогами(wdDialogEditReplace)
.ReplaceAll = 1
.Выполнить
End With
Когда у вас есть несколько текстовых файлов, которые могут иметь определенное имя или текстовую строку, которые вы хотите найти, вас может раздражать то, что вам приходится просматривать каждый из них, чтобы попытаться найти то, что вы хотите. Очевидно, что это просто неэффективно, особенно когда нужно просмотреть сотни или более файлов. Это становится еще более неприятно, когда вы хотите найти множество файлов по ключевым словам или фразам и заменить их чем-то другим, потому что такой инструмент, как Блокнот, просто не работает ни для чего, кроме самых простых задач.
Существует несколько более продвинутых текстовых редакторов, которые могут иметь функцию поиска и замены текстовых строк, но если вы не хотите использовать сам редактор, это может показаться немного бессмысленным. К счастью, есть инструменты, предназначенные для выполнения функции поиска и замены, и многие из них являются переносимыми, что означает, что если вы хотите сделать это только один или два раза, вам не нужно ничего устанавливать. Вот подборка из 5 инструментов поиска и замены с различной функциональностью.
<р>1. Найти и заменить (FAR)Инструмент «Найти и заменить» позволяет просто искать строки внутри файлов, заменять строки в соответствующих файлах, а также находить и заменять текст в именах файлов. FAR является кроссплатформенным и переносимым инструментом, потому что он построен на Java, но это также приводит к значительному использованию памяти. И, конечно же, для его использования вам потребуется установить Java Runtime Environment.
Практически все поля, в которые нужно вводить текст, могут принимать регулярные выражения. Перейдите в раздел Справка -> Регулярные выражения, чтобы получить дополнительную информацию о том, как их использовать. Обе функции замены и переименования требуют, чтобы вы сначала запустили функцию поиска, и вам просто нужно указать папку, шаблон имени файла и необязательное содержимое для поиска или отменить его, используя флажок «Исключить». Программа также имеет несколько основных фильтров выбора, некоторые операции копирования, перемещения и удаления файлов и параметры для обрезки или удаления пустых строк из файлов, а также возможность изменять кодировку файлов между Windows-1252/UTF-8/US. -ASCII.
<р>2. WildReplaceДля обычного использования WildReplace — это простой в использовании инструмент, который может выполнять простой поиск заданной строки и отображать результаты в Проводнике, например структурированное дерево папок с цветовой кодировкой. Установите флажок «Заменить на» и введите строку, чтобы начать операцию поиска и замены.
Есть некоторые очень полезные функции, такие как некоторые простые операции с файлами, когда вы можете копировать или перемещать файлы с соответствующей строкой в указанную папку или даже удалять их безвозвратно. Расширенные параметры позволят фильтровать файлы по размеру, атрибутам файла и дате. Самая мощная функция — это ввод регулярных выражений, где вы можете ввести свои собственные аргументы или нажать кнопку «Справка RegEx», чтобы получить окно, полное последовательностей, классов и разделителей, которые можно использовать. Он также включает в себя очень удобный тестер выражений для проверки различных последовательностей регулярных выражений. WildReplace также является переносимым.
<р>3. ТурбоСРЕсли вам нужен быстрый и простой инструмент поиска и замены, TurboSR может оказаться удобным, поскольку он не имеет реальных расширенных функций, а просто концентрируется на замене одной текстовой строки другой во всех выбранных файлах в указанной папке.
Эта программа представляет собой полностью переносимый автономный исполняемый файл, но имейте в виду, что она создает ярлык для себя в разделе "Стандартные" в меню "Пуск". Использование — это просто случай выбора текстового расширения для поиска, например .txt, .log или .html и т. д. (их около 15), найдите папку, в которой вы хотите выполнить поиск, и при необходимости отметьте опцию подпапки, введите строки «Искать» и «Заменить на», а затем нажмите кнопку «Перейти».Если совпадения будут найдены, TurboSR откроет всплывающее окно, в котором вы можете пропустить замену, заменить выбранный текст или заменить все совпадения с этого момента.
<р>4. Заменить текстReplace Text раньше назывался BK ReplaceEm и был довольно популярным инструментом для поиска и замены операций. Хотя сам инструмент «Заменить текст» больше не поддерживается и не разрабатывается, он по-прежнему весьма полезен и прост в использовании даже для замены нескольких фраз в нескольких текстовых файлах. Портативный инструмент также является полезным преимуществом.
Программа работает с использованием групп, в которые вы добавляете отдельные файлы или целые папки, а затем настраиваете весь поиск и замену текста для этой группы. Это весьма полезно, потому что у вас может быть несколько наборов файлов и местоположений, каждый со своим собственным набором замещающих строк. Просто добавьте файлы/папки в группу, нажмите на группу и введите весь исходный и замещающий текст. Резервное копирование может быть настроено и включено по умолчанию с расширением .backup. Щелкните правой кнопкой мыши текст, чтобы перейти к расширенному редактированию, где вы можете изменить поиск между регистром, точным, диапазоном и регулярным выражением, а также можете заменить текст или вставить его до или после строки поиска.
<р>5. TextCrawlerTextCrawler, без сомнения, является многофункциональной утилитой и имеет ряд встроенных расширенных функций. Принимая во внимание все предлагаемые дополнительные параметры, программа по-прежнему относительно проста в эксплуатации и может использоваться для более стандартных операций поиска и замены. на один файл или целую папку без особых проблем.
В дополнение к 7 предустановленным расширениям файлов вы также можете указать свой собственный фильтр и добавить фильтр исключения. Существует стандартный режим, в котором вы можете заменить, вставить до/после, удалить или очистить совпадающую строку, а также режим регулярного выражения для входа в более расширенные функции поиска и замены. Пользовательские регулярные выражения можно сохранить с помощью библиотечной функции, а также есть тестер выражений, где вы можете опробовать их, прежде чем применять к файлам. Некоторые другие ценные функции: нечеткий поиск, который находит близкие совпадения с искомым текстом, пакетный редактор, который позволяет использовать несколько вариантов замены в одних и тех же файлах, и средство извлечения текста, с помощью которого вы можете скопировать текст в новый файл. Резервное копирование можно включить в настройках.
Примечание редактора. Если вы используете сторонний текстовый редактор, такой как Notepad++, также стоит проверить, есть ли в нем функции поиска и замены в нескольких файлах. Например, в Notepad++ вы можете перейти в «Поиск» -> «Найти в файлах…» и выполнить поиск и замену содержимого каталога.
Читайте также: