Я пишу сценарий пакетного файла, используя среду командной строки Windows, и хочу заменить каждое вхождение некоторого текста в файле (например, «FOO») другим (например, «BAR»). Какой самый простой способ сделать это? Есть встроенные функции?
492
echo(%text:%search%=%replace%%)
Ответы:
Многие ответы здесь помогли мне указать верное направление, однако ни один из них не подошел для меня, поэтому я публикую свое решение.
У меня Windows 7, которая поставляется со встроенным PowerShell. Вот скрипт, который я использовал для поиска / замены всех экземпляров текста в файле:
Чтобы объяснить это:
powershell
запускает powershell.exe, который входит в состав Windows 7-Command "... "
командная строка для powershell.exe, содержащая команду для запуска(gc myFile.txt)
читает содержимоеmyFile.txt
(gc
сокращенно отGet-Content
команды)-replace 'foo', 'bar'
просто запускает команду замены для заменыfoo
наbar
| Out-File myFile.txt
направляет вывод в файлmyFile.txt
-encoding ASCII
предотвращает расшифровку выходного файла в Unicode, как отмечают комментарииPowershell.exe уже должен быть частью вашего оператора PATH, но если нет, вы можете добавить его. Расположение его на моей машине
C:\WINDOWS\system32\WindowsPowerShell\v1.0
источник
-encoding ASCII
или,UTF8
или что угодно. Также помните, что если вы нацелены на UTF8, в начале файла может появиться метка порядка байтов, которая не появилась в оригинале.-encoding ASCII
. Для любого, кто нуждается в этом в будущем, это будетOut-File -encoding ASCII myFile.txt
Set-Content
вместоOut-File
.Если у вас версия Windows, которая поддерживает .Net 2.0, я бы заменил вашу оболочку. PowerShell дает вам всю мощь .Net из командной строки. Есть много встроенных командлетов. Пример ниже решит ваш вопрос. Я использую полные названия команд, есть более короткие псевдонимы, но это дает вам кое-что для Google.
источник
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Только что использованный FART ( утилита командной строки " F ind A nd R eplace T ext"):
отличная бесплатная программа для замены текста в большом наборе файлов.
Установочные файлы находятся на SourceForge .
Пример использования:
будет предварительно выполнять рекурсивные замены в файлах этого дистрибутива Perl.
Единственная проблема: иконка сайта FART не совсем со вкусом, изысканно или элегантно;)
Обновление 2017 года (7 лет спустя) Jagb отмечает в комментариях к статье 2011 года « FARTing the Easy Way - найдите и замените текст » от Mikail Tunç
источник
/
и'
поскольку это не работает для всех нас , для меня это работало в некоторых случаи, но он не работал на некоторых файлах, и я не знаю почему .. Я использовал это, чтобы заменить текст другим текстом и/
Заменить - заменить подстроку с помощью подстановки строк. Описание: для замены подстроки другой строкой используйте функцию подстановки строк. Показанный здесь пример заменяет все вхождения «те» орфографические ошибки на «в» в строковой переменной str.
Выход скрипта:
ссылка: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
источник
Создайте файл replace.vbs:
Чтобы использовать этот пересмотренный скрипт (который мы будем называть replace.vbs), просто наберите в командной строке команду, похожую на эту:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
источник
RegExp
. Вы можете использовать это , чтобы заменить , используя регулярное выражение:With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With
. Вы можете получить текст из первых 9 захватывающих групп , используя$1
,$2
...$9
.BatchSubstitute.bat
На dostips.com приведен пример поиска и замены с использованием чистого командного файла.Он использует комбинацию
FOR
,FIND
иCALL SET
.Строки, содержащие символы среди,
"&<>]|^
могут быть обработаны неправильно.источник
Примечание. Обязательно посмотрите обновление в конце этого ответа, чтобы найти ссылку на превосходный JREPL.BAT, который заменяет REPL.BAT JREPL.BAT 7.0 и более поздних
версий, поддерживает Юникод (UTF-16LE) через эту
/UTF
опцию, а также любые другие. другой набор символов, включая UTF-8, через ADO !!!!Я написал небольшую гибридную утилиту JScript / batch 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 каждый раз, когда вы хотите использовать утилиту.
Вот скрипт REPL.BAT. Полная документация встроена в скрипт.
ВАЖНОЕ ОБНОВЛЕНИЕ
Я прекратил разработку REPL.BAT и заменил ее на JREPL.BAT. Эта новая утилита имеет все те же функциональные возможности REPL.BAT, а также многое другое:
Как всегда, полная документация встроена в скрипт.
Оригинальное тривиальное решение теперь стало еще проще:
Текущая версия JREPL.BAT доступна на DosTips . Прочитайте все последующие сообщения в ветке, чтобы увидеть примеры использования и историю развития.
источник
\q
представления"
, и литералы поиска теперь поддерживают все расширенные escape-последовательности, когда комбинируются опции L и X.Используйте FNR
Используйте
fnr
утилиту. У него есть некоторые преимущества передfart
:Скачать FNR можно здесь: http://findandreplace.io/?z=codeplex
Пример использования:
fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"
источник
Я не думаю, что есть способ сделать это с помощью каких-либо встроенных команд. Я хотел бы предложить вам скачать что - то вроде gnuwin32 или UnxUtils и использовать
sed
команду (или загрузить толькоsed
):источник
sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`
-i - редактировать файл на месте; -b - не обрабатывать CR + LF - без этой опции CR + LF будет конвертирован в LFЯ знаю, что я опоздал на вечеринку ..
Лично мне нравится решение по адресу: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
Мы также широко используем функцию дедупликации, чтобы помочь нам ежедневно доставлять около 500 электронных писем по SMTP с: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
и оба они работают изначально без дополнительных инструментов или утилит, необходимых.
Заменитель
ДЕДУПЛИКАТОР (обратите внимание на использование -9 для номера ABA):
Спасибо!
источник
Когда вы работаете с Git на Windows, просто запустите
git-bash
и используйтеsed
. Или, при использовании Windows 10, запустите «Bash на Ubuntu в Windows» (из подсистемы Linux) и используйтеsed
.Это потоковый редактор, но он может редактировать файлы напрямую с помощью следующей команды:
-i
опция используется для редактирования на месте имени файла.-e
опция указывает команду для запуска.s
используется для замены найденного выражения "foo" на "bar" иg
используется для замены любых найденных совпадений.Примечание от ereOn:
Если вы хотите заменить строку в версионных файлах только Git-репозитория, вы можете использовать:
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
который творит чудеса.
источник
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
это работает чудесно.Я поиграл с некоторыми из существующих ответов здесь и предпочел бы мое улучшенное решение ...
или если вы хотите снова сохранить вывод в файл ...
Преимущество этого заключается в том, что вы можете передавать данные из любой программы. Также рассмотрим использование регулярных выражений. Не могу понять, как превратить его в BAT-файл для более легкого использования ... :-(
источник
type
означает, что все строки длиной более 80 символов переносятся. Как больно.Я использовал Perl, и это прекрасно работает.
.orig - это расширение, которое будет добавлено к исходному файлу.
Для ряда подходящих файлов, таких как * .html
источник
sed
наperl -pi.backup -e
и оцените его :)С replacer.bat
1) С
e?
опцией, которая будет оценивать специальные последовательности символов, такие как\n\r
и Unicode последовательности. В этом случае заменим указанное"Foo"
и"Bar"
:2) Простая замена, где
Foo
иBar
не указаны.источник
Вот решение, которое я нашел, работает на Win XP. В мой рабочий пакетный файл я включил следующее:
replace.bat
Файл , как показано ниже. Я не нашел способ включить эту функцию в тот же пакетный файл, потому что%%a
переменная всегда дает последнее значение в цикле for.replace.bat
:источник
Посмотрите, есть ли какая-нибудь утилита, похожая на sed, для cmd.exe, которая запрашивает эквивалент sed под Windows, должна также применяться к этому вопросу. Управляющее резюме:
источник
Может быть, немного поздно, но я часто ищу подобные вещи, так как я не хочу переживать боль одобрения программного обеспечения.
Однако вы обычно используете оператор FOR в различных формах. Кто-то создал полезный командный файл, который выполняет поиск и замену. Посмотрите здесь . Важно понимать ограничения предоставляемого командного файла. По этой причине я не копирую исходный код в этом ответе.
источник
Два пакетных файла, которые предоставляют
search and replace
функции, были написаны членами Stack Overflowdbenham
иaacini
используютсяnative built-in jscript
в Windows.Они оба
robust
иvery swift with large files
сравниваются с простыми пакетными сценариями, а такжеsimpler
используются для базовой замены текста. У них обоих естьWindows regular expression
соответствие шаблону.Этот
sed-like
вспомогательный командный файл называетсяrepl.bat
(dbenham).Пример использования
L
буквального переключателя:Этот
grep-like
вспомогательный пакетный файл называетсяfindrepl.bat
(aacini).Пример с активными регулярными выражениями:
Оба становятся мощными общесистемными утилитами
when placed in a folder that is on the path
, или могут использоваться в одной папке с командным файлом, или из командной строки cmd.У них обоих есть
case-insensitive
переключатели, а также много других функций.источник
Команда Power Shell работает как шарм
источник
Просто столкнулся с похожей проблемой - «Поиск и замена текста в файлах», но за исключением того, что для имен файлов и поиска / переотображения мне нужно использовать регулярное выражение. Поскольку я не знаком с Powershell и хочу сохранить результаты поиска для последующего использования, мне нужно что-то более «удобное» (предпочтительно, если оно имеет графический интерфейс).
Итак, пока гуглю :) я нашел отличный инструмент - FAR (Find And Replace) (не FART).
Эта небольшая программа имеет приятный графический интерфейс и поддержку регулярных выражений для поиска в именах файлов и в файлах. Единственным недостатком является то, что если вы хотите сохранить свои настройки, вы должны запустить программу от имени администратора (по крайней мере, на Win7).
источник
Я предпочитаю использовать
sed
из GNU утилиты для Win32 , необходимо отметить следующееТаким образом, рабочий код
sed
для поиска и замены текста в файле в Windows, как показано нижеисточник
-i
! Если ваша версия sed делает это, проверьте команду из этого ответа: stackoverflow.com/a/33762001/2492801 .Это одна вещь, которую пакетные сценарии просто не делают хорошо.
Сценарий, на который ссылается morechilli, будет работать для некоторых файлов, но, к сожалению, он будет подавлен теми, которые содержат символы, такие как трубы и амперсанды.
VBScript - лучший встроенный инструмент для этой задачи. См. Эту статью для примера: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
источник
@Rachel дал отличный ответ, но здесь есть вариант, чтобы читать содержимое в
$data
переменную powershell . Затем вы можете легко манипулировать контентом несколько раз перед записью в выходной файл. Также посмотрите, как многострочные значения приведены в пакетных файлах .bat.источник
Используйте powershell в .bat - для Windows 7+
кодировка utf8 не является обязательной, хорошо для веб-сайтов
источник
Загрузите Cygwin (бесплатно) и используйте unix-подобные команды в командной строке Windows.
Ваша лучшая ставка: сед
источник
Также можно увидеть инструменты Replace и ReplaceFilter по адресу https://zoomicon.github.io/tranXform/ (источник включен). Второй - это фильтр.
Инструмент, который заменяет строки в файлах, находится в VBScript (для работы в старых версиях Windows требуется Windows Script Host [WSH])
Фильтр, вероятно, не работает с Unicode, если вы не перекомпилируете с последней версией Delphi (или с FreePascal / Lazarus)
источник
Я сталкивался с этой проблемой несколько раз при кодировании под Visual C ++. Если у вас есть, вы можете использовать Visual Studio Find and Replace Utility. Это позволяет вам выбрать папку и заменить содержимое любого файла в этой папке любым другим текстом, который вы хотите.
В Visual Studio: «Правка» -> «Найти и заменить». В открывшемся диалоговом окне выберите папку и заполните поля «Найти чем» и «Заменить». Надеюсь, это будет полезно.
источник