Как найти и заменить текст в файле, используя среду командной строки Windows? - PullRequest
437 голосов
/ 13 сентября 2008

Я пишу сценарий пакетного файла, используя среду командной строки Windows, и хочу заменить каждое вхождение одного текста в файле (например, «FOO») другим (например, «BAR»). Какой самый простой способ сделать это? Есть встроенные функции?

Ответы [ 27 ]

13 голосов
/ 17 ноября 2015

Когда вы работаете с Git в Windows , просто запустите git-bash и используйте sed. Или при использовании Windows 10 запустите «Bash в Ubuntu в Windows» (из подсистемы Linux) и используйте sed.

Это потоковый редактор, но он может редактировать файлы напрямую, используя следующую команду:

sed -i -e 's/foo/bar/g' filename
  • -i опция используется для редактирования на месте имени файла.
  • -e указывает команду для запуска.
    • s используется для замены найденного выражения "foo" на "bar", а g используется для замены любых найденных совпадений.

Примечание ereOn:

Если вы хотите заменить строку в версионных файлах только Git-репозитория, вы можете использовать:

git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

, который творит чудеса.

12 голосов
/ 09 декабря 2010

Я использовал Perl, и это прекрасно работает.

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig - это расширение, которое будет добавлено к исходному файлу

Для ряда подходящих файлов, например * .html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
12 голосов
/ 08 мая 2012

Я поиграл с некоторыми из существующих ответов здесь и предпочел бы мое улучшенное решение ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"

или если вы хотите снова сохранить вывод в файл ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt

Преимущество этого заключается в том, что вы можете передавать данные из любой программы. Также рассмотрим использование регулярных выражений. Не могу понять, как превратить его в BAT-файл для более легкого использования ...: - (

11 голосов
/ 15 октября 2015

С replacer.bat

1) С опцией e?, которая будет оценивать специальные последовательности символов, такие как \n\r и последовательности Unicode. В этом случае замените указанные "Foo" и "Bar":

call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"

2) Простая замена, если Foo и Bar не указаны.

call replacer.bat "C:\content.txt" "Foo" "Bar"
9 голосов
/ 10 марта 2010

Вот решение, которое я нашел, работает на Win XP. В мой рабочий пакетный файл я включил следующее:

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

Файл replace.bat показан ниже. Я не нашел способа включить эту функцию в один и тот же пакетный файл, потому что переменная %%a всегда дает последнее значение в цикле for.

replace.bat

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal
7 голосов
/ 15 октября 2008

Взгляните на Есть ли какая-либо утилита, подобная sed для cmd.exe , которая запрашивает эквивалент sed под Windows, должна также применяться к этому вопросу. Резюме:

  • Это можно сделать в пакетном файле, но это не очень
  • Множество доступных сторонних исполняемых файлов, которые сделают это за вас, если у вас есть возможность установить или просто скопировать exe
  • Может быть сделано с VBScript или аналогичным, если вам нужно что-то, что может работать на коробке Windows без изменений и т. Д.
4 голосов
/ 22 июля 2014

Два пакетных файла, которые предоставляют функции search and replace, были написаны членами переполнения стека dbenham и aacini с использованием native built-in jscript в Windows.

Они оба robust и very swift with large files по сравнению с обычными пакетными сценариями, а также simpler для базовой замены текста. Они оба имеют Windows regular expression соответствие шаблону.

  1. Этот sed-like вспомогательный пакетный файл называется repl.bat (от dbenham).

    Пример использования буквального переключателя L:

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Этот grep-like вспомогательный пакетный файл называется findrepl.bat (от aacini).

    Пример с активными регулярными выражениями:

    echo This is FOO here|findrepl "FOO" "BAR" 
    echo and with a file:
    type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
    

Обе становятся мощными общесистемными утилитами when placed in a folder that is on the path, или могут использоваться в одной папке с командным файлом или из командной строки cmd.

Оба имеют переключатели case-insensitive, а также множество других функций.

4 голосов
/ 23 декабря 2009

Может быть немного поздно, но я часто ищу подобные вещи, так как не хочу испытывать боль от одобрения программного обеспечения.

Однако вы обычно используете оператор FOR в различных формах. Кто-то создал полезный командный файл, который выполняет поиск и замену. Посмотрите здесь . Важно понимать ограничения предоставляемого командного файла. По этой причине я не копирую исходный код в этом ответе.

3 голосов
/ 04 августа 2015

Только что столкнулся с похожей проблемой - «Поиск и замена текста в файлах», но за исключением того, что для имен файлов и поиска / переотображения мне нужно использовать регулярное выражение. Поскольку я не знаком с Powershell и хочу сохранить результаты поиска для последующего использования, мне нужно что-то более «удобное для пользователя» (предпочтительно, если оно имеет графический интерфейс).

Итак, пока гуглил :) Я нашел отличный инструмент - FAR (Найти и заменить) (не FART).

Эта небольшая программа имеет приятный графический интерфейс и поддерживает регулярные выражения для поиска в именах файлов и в файлах. Единственным недостатком является то, что если вы хотите сохранить свои настройки, вы должны запустить программу от имени администратора (по крайней мере, на Win7).

3 голосов
/ 22 июля 2010

Команда Power Shell работает как шарм

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)
...