Как найти и заменить текст в файле с помощью среды командной строки Windows?

Я пишу сценарий пакетного файла с помощью среды командной строки Windows и хочу изменить каждое вхождение некоторого текста в файле (например. "FOO") с другим (ex. "БАР.)" Как это сделать проще всего? Любые встроенные функции?

26 ответов


Если вы находитесь в версии Windows, которая поддерживает .Net 2.0, я бы заменил вашу оболочку. PowerShell дает вам полную мощность .Net из командной строки. Есть много командлетов, встроенных также. Приведенный ниже пример решит ваш вопрос. Я использую полные имена команд, есть более короткие псевдонимы, но это дает вам что-то искать в Гугле.

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

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

у меня есть Windows 7, который поставляется со встроенным PowerShell. Вот скрипт, который я использовал для поиска / замены всех экземпляров текста в файле:

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File myFile.txt"

объяснить это:

  • powershell запускает powershell.exe, который включен в Windows 7
  • -Command "... " является arg командной строки для в PowerShell.exe, содержащий команду для запуска
  • (gc myFile.txt) читает содержание myFile.txt (gc сокращенно от Get-Content команда)
  • -replace 'foo', 'bar' просто запускает команду replace для замены foo С bar
  • | Out-File myFile.txt передает выходные данные в файл myFile.txt

в PowerShell.exe должен быть частью вашего оператора PATH уже, но если нет, вы можете добавить его. Расположение его на моей машине C:\WINDOWS\system32\WindowsPowerShell\v1.0


просто использовать пердеть ("F ind A nd R eplace T ext" утилита командной строки):
отличная бесплатная программа для замены текста в большом наборе файлов.

настройки файлы находятся на SourceForge.

пример использования:

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

будет просматривать замены рекурсивно в файлах этого Perl распределение.

единственная проблема: значок веб-сайта пердеть не совсем со вкусом, изысканный или элегантный;)


обновление 2017 (7 лет спустя) jagb указывает в комментариях к статье 2011 года"пердеж простой способ-найти и заменить текст" из Микаила Тунч


Replace-заменить подстроку с помощью подстановки строк Описание: для замены подстроки другой строкой используйте функцию подстановки строк. Приведенный здесь пример заменяет все вхождения "teh" орфографические ошибки на "the" в строковой переменной str.

set str=teh cat in teh hat
echo.%str%
set str=%str:teh=the%
echo.%str%

Скрипт:

teh cat in teh hat
the cat in the hat

ref:http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace


создать файл заменить.vbs:

Const ForReading = 1    
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close

использовать этот пересмотренный скрипт (который мы будем называть replace.ВБС) просто введите следующую команду из командной строки:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "


BatchSubstitute.bat ВКЛ dostips.com является примером поиска и замены с использованием чистого пакетного файла.

Он использует комбинацию FOR, FIND и CALL SET.

строки, содержащие символы среди "&<>]|^ может рассматриваться неправильно.



Примечание - обязательно см. обновление в конце этого ответа для ссылки на улучшенный JREPL.Летучая мышь, которая заменяет REPL.Летучая мышь!--11-->
JREPL.BAT 7.0 и выше изначально поддерживает unicode (UTF-16LE) через /UTF опция, а также любой другой набор символов, включая UTF-8, через ADO!!!!


я написал небольшую гибридную утилиту JScript/batch под названием REPL.Летучая мышь!--18--> что очень удобно для изменения ASCII (или расширенного ASCII) файлов через командную строку или пакетный файл. Чисто собственный скрипт не требует установки какой-либо исполняемой третьей стороны, и он работает на любой современной версии Windows, начиная с XP. Это также очень быстро, особенно по сравнению с чистыми пакетными решениями.

REPL.BAT просто читает stdin, выполняет поиск и замену регулярных выражений JScript и записывает результат в stdout.

вот тривиальный пример того, как замените foo на bar в тесте.txt, предполагая REPL.BAT находится в вашей текущей папке, или еще лучше, где-то в пределах вашего пути:

type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt

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

я включил ряд опций в утилиту, которые делают ее довольно мощной. Например, объединение M и X опции позволяют изменять двоичные файлы! The M многострочная опция позволяет выполнять поиск по нескольким строкам. The X опция расширенного шаблона подстановки предоставляет escape-последовательности, которые позволяют включить любое двоичное значение в текст замены.

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

вот REPL.Bat скрипт. Полная документация встроена в скрипт.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
::REPL.BAT version 6.2
:::
:::REPL  Search  Replace  [Options  [SourceVar]]
:::REPL  /?[REGEX|REPLACE]
:::REPL  /V
:::
:::  Performs a global regular expression search and replace operation on
:::  each line of input from stdin and prints the result to stdout.
:::
:::  Each parameter may be optionally enclosed by double quotes. The double
:::  quotes are not considered part of the argument. The quotes are required
:::  if the parameter contains a batch token delimiter like space, tab, comma,
:::  semicolon. The quotes should also be used if the argument contains a
:::  batch special character like &, |, etc. so that the special character
:::  does not need to be escaped with ^.
:::
:::  If called with a single argument of /?, then prints help documentation
:::  to stdout. If a single argument of /?REGEX, then opens up Microsoft's
:::  JScript regular expression documentation within your browser. If a single
:::  argument of /?REPLACE, then opens up Microsoft's JScript REPLACE
:::  documentation within your browser.
:::
:::  If called with a single argument of /V, case insensitive, then prints
:::  the version of REPL.BAT.
:::
:::  Search  - By default, this is a case sensitive JScript (ECMA) regular
:::            expression expressed as a string.
:::
:::            JScript regex syntax documentation is available at
:::            http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx
:::
:::  Replace - By default, this is the string to be used as a replacement for
:::            each found search expression. Full support is provided for
:::            substituion patterns available to the JScript replace method.
:::
:::            For example, $& represents the portion of the source that matched
:::            the entire search pattern,  represents the first captured
:::            submatch,  the second captured submatch, etc. A $ literal
:::            can be escaped as $$.
:::
:::            An empty replacement string must be represented as "".
:::
:::            Replace substitution pattern syntax is fully documented at
:::            http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx
:::
:::  Options - An optional string of characters used to alter the behavior
:::            of REPL. The option characters are case insensitive, and may
:::            appear in any order.
:::
:::            A - Only print altered lines. Unaltered lines are discarded.
:::                If the S options is present, then prints the result only if
:::                there was a change anywhere in the string. The A option is
:::                incompatible with the M option unless the S option is present.
:::
:::            B - The Search must match the beginning of a line.
:::                Mostly used with literal searches.
:::
:::            E - The Search must match the end of a line.
:::                Mostly used with literal searches.
:::
:::            I - Makes the search case-insensitive.
:::
:::            J - The Replace argument represents a JScript expression.
:::                The expression may access an array like arguments object
:::                named $. However, $ is not a true array object.
:::
:::                The $.length property contains the total number of arguments
:::                available. The $.length value is equal to n+3, where n is the
:::                number of capturing left parentheses within the Search string.
:::
:::                $[0] is the substring that matched the Search,
:::                $[1] through $[n] are the captured submatch strings,
:::                $[n+1] is the offset where the match occurred, and
:::                $[n+2] is the original source string.
:::
:::                Arguments $[0] through $[10] may be abbreviated as
:::                 through . Argument $[11] and above must use the square
:::                bracket notation.
:::
:::            L - The Search is treated as a string literal instead of a
:::                regular expression. Also, all $ found in the Replace string
:::                are treated as $ literals.
:::
:::            M - Multi-line mode. The entire contents of stdin is read and
:::                processed in one pass instead of line by line, thus enabling
:::                search for \n. This also enables preservation of the original
:::                line terminators. If the M option is not present, then every
:::                printed line is terminated with carriage return and line feed.
:::                The M option is incompatible with the A option unless the S
:::                option is also present.
:::
:::                Note: If working with binary data containing NULL bytes,
:::                      then the M option must be used.
:::
:::            S - The source is read from an environment variable instead of
:::                from stdin. The name of the source environment variable is
:::                specified in the next argument after the option string. Without
:::                the M option, ^ anchors the beginning of the string, and $ the
:::                end of the string. With the M option, ^ anchors the beginning
:::                of a line, and $ the end of a line.
:::
:::            V - Search and Replace represent the name of environment
:::                variables that contain the respective values. An undefined
:::                variable is treated as an empty string.
:::
:::            X - Enables extended substitution pattern syntax with support
:::                for the following escape sequences within the Replace string:
:::
:::                \     -  Backslash
:::                \b     -  Backspace
:::                \f     -  Formfeed
:::                \n     -  Newline
:::                \q     -  Quote
:::                \r     -  Carriage Return
:::                \t     -  Horizontal Tab
:::                \v     -  Vertical Tab
:::                \xnn   -  Extended ASCII byte code expressed as 2 hex digits
:::                \unnnn -  Unicode character expressed as 4 hex digits
:::
:::                Also enables the \q escape sequence for the Search string.
:::                The other escape sequences are already standard for a regular
:::                expression Search string.
:::
:::                Also modifies the behavior of \xnn in the Search string to work
:::                properly with extended ASCII byte codes.
:::
:::                Extended escape sequences are supported even when the L option
:::                is used. Both Search and Replace support all of the extended
:::                escape sequences if both the X and L opions are combined.
:::
:::  Return Codes:  0 = At least one change was made
:::                     or the /? or /V option was used
:::
:::                 1 = No change was made
:::
:::                 2 = Invalid call syntax or incompatible options
:::
:::                 3 = JScript runtime error, typically due to invalid regex
:::
::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini
::: to get \xnn to work properly with extended ASCII byte codes. Also assistance
::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a
::: workaround. REPL.BAT was originally posted at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
  if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a
    exit /b 0
  ) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "" a
    exit /b 0
  ) else (
    call :err "Insufficient arguments"
    exit /b 2
  )
)
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
  call :err "Invalid option(s)"
  exit /b 2
)
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
  call :err "Incompatible options"
  exit /b 2
)
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var rtn=1;
try {
  var env=WScript.CreateObject("WScript.Shell").Environment("Process");
  var args=WScript.Arguments;
  var search=args.Item(0);
  var replace=args.Item(1);
  var options="g";
  if (args.length>2) options+=args.Item(2).toLowerCase();
  var multi=(options.indexOf("m")>=0);
  var alterations=(options.indexOf("a")>=0);
  if (alterations) options=options.replace(/a/g,"");
  var srcVar=(options.indexOf("s")>=0);
  if (srcVar) options=options.replace(/s/g,"");
  var jexpr=(options.indexOf("j")>=0);
  if (jexpr) options=options.replace(/j/g,"");
  if (options.indexOf("v")>=0) {
    options=options.replace(/v/g,"");
    search=env(search);
    replace=env(replace);
  }
  if (options.indexOf("x")>=0) {
    options=options.replace(/x/g,"");
    if (!jexpr) {
      replace=replace.replace(/\\/g,"\B");
      replace=replace.replace(/\q/g,"\"");
      replace=replace.replace(/\x80/g,"\u20AC");
      replace=replace.replace(/\x82/g,"\u201A");
      replace=replace.replace(/\x83/g,"\u0192");
      replace=replace.replace(/\x84/g,"\u201E");
      replace=replace.replace(/\x85/g,"\u2026");
      replace=replace.replace(/\x86/g,"\u2020");
      replace=replace.replace(/\x87/g,"\u2021");
      replace=replace.replace(/\x88/g,"\u02C6");
      replace=replace.replace(/\x89/g,"\u2030");
      replace=replace.replace(/\x8[aA]/g,"\u0160");
      replace=replace.replace(/\x8[bB]/g,"\u2039");
      replace=replace.replace(/\x8[cC]/g,"\u0152");
      replace=replace.replace(/\x8[eE]/g,"\u017D");
      replace=replace.replace(/\x91/g,"\u2018");
      replace=replace.replace(/\x92/g,"\u2019");
      replace=replace.replace(/\x93/g,"\u201C");
      replace=replace.replace(/\x94/g,"\u201D");
      replace=replace.replace(/\x95/g,"\u2022");
      replace=replace.replace(/\x96/g,"\u2013");
      replace=replace.replace(/\x97/g,"\u2014");
      replace=replace.replace(/\x98/g,"\u02DC");
      replace=replace.replace(/\x99/g,"\u2122");
      replace=replace.replace(/\x9[aA]/g,"\u0161");
      replace=replace.replace(/\x9[bB]/g,"\u203A");
      replace=replace.replace(/\x9[cC]/g,"\u0153");
      replace=replace.replace(/\x9[dD]/g,"\u009D");
      replace=replace.replace(/\x9[eE]/g,"\u017E");
      replace=replace.replace(/\x9[fF]/g,"\u0178");
      replace=replace.replace(/\b/g,"\b");
      replace=replace.replace(/\f/g,"\f");
      replace=replace.replace(/\n/g,"\n");
      replace=replace.replace(/\r/g,"\r");
      replace=replace.replace(/\t/g,"\t");
      replace=replace.replace(/\v/g,"\v");
      replace=replace.replace(/\x[0-9a-fA-F]{2}|\u[0-9a-fA-F]{4}/g,
        function(,,){
          return String.fromCharCode(parseInt("0x"+.substring(2)));
        }
      );
      replace=replace.replace(/\B/g,"\");
    }
    search=search.replace(/\\/g,"\B");
    search=search.replace(/\q/g,"\"");
    search=search.replace(/\x80/g,"\u20AC");
    search=search.replace(/\x82/g,"\u201A");
    search=search.replace(/\x83/g,"\u0192");
    search=search.replace(/\x84/g,"\u201E");
    search=search.replace(/\x85/g,"\u2026");
    search=search.replace(/\x86/g,"\u2020");
    search=search.replace(/\x87/g,"\u2021");
    search=search.replace(/\x88/g,"\u02C6");
    search=search.replace(/\x89/g,"\u2030");
    search=search.replace(/\x8[aA]/g,"\u0160");
    search=search.replace(/\x8[bB]/g,"\u2039");
    search=search.replace(/\x8[cC]/g,"\u0152");
    search=search.replace(/\x8[eE]/g,"\u017D");
    search=search.replace(/\x91/g,"\u2018");
    search=search.replace(/\x92/g,"\u2019");
    search=search.replace(/\x93/g,"\u201C");
    search=search.replace(/\x94/g,"\u201D");
    search=search.replace(/\x95/g,"\u2022");
    search=search.replace(/\x96/g,"\u2013");
    search=search.replace(/\x97/g,"\u2014");
    search=search.replace(/\x98/g,"\u02DC");
    search=search.replace(/\x99/g,"\u2122");
    search=search.replace(/\x9[aA]/g,"\u0161");
    search=search.replace(/\x9[bB]/g,"\u203A");
    search=search.replace(/\x9[cC]/g,"\u0153");
    search=search.replace(/\x9[dD]/g,"\u009D");
    search=search.replace(/\x9[eE]/g,"\u017E");
    search=search.replace(/\x9[fF]/g,"\u0178");
    if (options.indexOf("l")>=0) {
      search=search.replace(/\b/g,"\b");
      search=search.replace(/\f/g,"\f");
      search=search.replace(/\n/g,"\n");
      search=search.replace(/\r/g,"\r");
      search=search.replace(/\t/g,"\t");
      search=search.replace(/\v/g,"\v");
      search=search.replace(/\x[0-9a-fA-F]{2}|\u[0-9a-fA-F]{4}/g,
        function(,,){
          return String.fromCharCode(parseInt("0x"+.substring(2)));
        }
      );
      search=search.replace(/\B/g,"\");
    } else search=search.replace(/\B/g,"\\");
  }
  if (options.indexOf("l")>=0) {
    options=options.replace(/l/g,"");
    search=search.replace(/([.^$*+?()[{\|])/g,"\");
    if (!jexpr) replace=replace.replace(/$/g,"$$$$");
  }
  if (options.indexOf("b")>=0) {
    options=options.replace(/b/g,"");
    search="^"+search
  }
  if (options.indexOf("e")>=0) {
    options=options.replace(/e/g,"");
    search=search+"$"
  }
  var search=new RegExp(search,options);
  var str1, str2;

  if (srcVar) {
    str1=env(args.Item(3));
    str2=str1.replace(search,jexpr?replFunc:replace);
    if (!alterations || str1!=str2) if (multi) {
      WScript.Stdout.Write(str2);
    } else {
      WScript.Stdout.WriteLine(str2);
    }
    if (str1!=str2) rtn=0;
  } else if (multi){
    var buf=1024;
    str1="";
    while (!WScript.StdIn.AtEndOfStream) {
      str1+=WScript.StdIn.Read(buf);
      buf*=2
    }
    str2=str1.replace(search,jexpr?replFunc:replace);
    WScript.Stdout.Write(str2);
    if (str1!=str2) rtn=0;
  } else {
    while (!WScript.StdIn.AtEndOfStream) {
      str1=WScript.StdIn.ReadLine();
      str2=str1.replace(search,jexpr?replFunc:replace);
      if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2);
      if (str1!=str2) rtn=0;
    }
  }
} catch(e) {
  WScript.Stderr.WriteLine("JScript runtime error: "+e.message);
  rtn=3;
}
WScript.Quit(rtn);

function replFunc(, , , , , , , , , , ) {
  var $=arguments;
  return(eval(replace));
}


ВАЖНОЕ ОБНОВЛЕНИЕ

я прекратил развитие REPL.Бат, и заменил его на JREPL.ЛЕТУЧАЯ МЫШЬ. Эта новая утилита имеет все ту же функциональность REPL.Летучая мышь, плюс многое другое:

  • поддержка Unicode UTF-16LE через собственные возможности cscript unicode и любой другой набор символов (включая UTF-8) через ADO.
  • чтение непосредственно из / запись непосредственно в файл: нет необходимости трубы, перенаправление или команда перемещения.
  • включить пользовательский JScript
  • средство перевода подобно unix tr, только оно также поддерживает поиск regex и JScript replace
  • отбросить несоответствующий текст
  • префикс выходных строк с номером строки
  • и многое другое...

как всегда, полная документация встроена в сценарий.

первоначальное тривиальное решение теперь даже проще:

jrepl "foo" "bar" /f test.txt /o -

текущая версия JREPL.Летучая мышь доступна на DosTips. Прочитайте все последующие сообщения в потоке, чтобы увидеть примеры использования и историю разработки.


использовать FNR

использовать fnr утилиты. У него есть некоторые преимущества перед fart:

  • регулярные выражения
  • дополнительный интерфейс. Имеет кнопку "создать командную строку" для создания текста командной строки для размещения в пакетном файле.
  • многострочные шаблоны: GUI позволяет легко работать с многострочными шаблонами. В FART вам придется вручную избегать разрывов линий.
  • позволяет выбрать кодировку файла. Также имеет автоматическое обнаружение выбор.

скачать FNR здесь:http://findandreplace.codeplex.com/

пример использования : fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"


Я не думаю, что есть способ сделать это с помощью встроенных команд. Я бы предложил вам скачать что-то вроде Gnuwin32 или UnxUtils и с помощью sed команда (или загрузить только sed):

sed -c s/FOO/BAR/g filename

Я знаю, что опаздываю на вечеринку..

лично мне нравится решение в: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

мы также широко используем функцию Dedupe, чтобы помочь нам ежедневно доставлять примерно 500 электронных писем через SMTP из: - https://groups.google.com/forum#!тема / alt.msdos.партия.nt/sj8IUhMOq6o

и они оба работают изначально без дополнительных инструментов или утилит необходимый.

замена:

DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL

DEDUPLICATOR (обратите внимание на использование -9 за номер ABA):

REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt

set MapFile=Mapping.txt
set ReplaceFile=New.txt

del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b

find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL

спасибо!


когда вы работаете с Git на Windows тогда просто запустите git-bash и использовать sed. Или, при использовании Windows 10, запустите "Bash on Ubuntu on 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'

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


я использовал 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

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

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 для более легкого использования... :-(


С замена.летучая мышь!--10-->

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

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

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

call replacer.bat "C:\content.txt" "Foo" "Bar"

вот решение, которое я нашел, работало на 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

на Как ниже. Я не нашел способ включить эту функцию в тот же пакетный файл, потому что %%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

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

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

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

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


два пакетных файла, которые поставляют 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 (by dbenham) - загрузить с: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

пример использования 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 (by aacini) - загрузить с: https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

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

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, или может быть использован в той же папке с пакетным файлом, или из командной строки.

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


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

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

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

Итак, в то время как Googling :) я нашел отличный инструмент -FAR (найти и заменить) (не фарт).

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


Это одна вещь, которую пакетные сценарии просто не делают хорошо.

скрипт morechilli linked to будет работать для некоторых файлов, но, к сожалению, он задохнется на тех, которые содержат символы, такие как трубы и амперсанды.

VBScript является лучшим встроенным инструментом для этой задачи. См. эту статью для примера: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx


@Rachel дал отличный ответ, но вот его вариант для чтения содержимого в powershell $data переменной. Затем вы можете легко манипулировать содержимым несколько раз перед записью в выходной файл. Также смотрите, как многострочные значения приведены в .летучая мышь пакетных файлов.

@REM ASCII=7bit ascii(no bom), UTF8=with bom marker
set cmd=^
  $old = '$Param1$'; ^
  $new = 'Value1'; ^
  [string[]]$data = Get-Content 'datafile.txt'; ^
  $data = $data -replace $old, $new; ^
  out-file -InputObject $data -encoding UTF8 -filepath 'datafile.txt';
powershell -NoLogo -Noninteractive -InputFormat none -Command "%cmd%"

используйте powershell .bat-для Windows 7+

кодировка utf8 необязательна, хороша для веб-сайтов

@echo off
set ffile='myfile.txt'
set fold='FOO'
set fnew='BAR'
powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8"

скачать Cygwin (бесплатно) и используйте unix-подобные команды в командной строке Windows.

ваш лучший выбор: sed


также можно увидеть инструменты Replace и ReplaceFilter в https://zoomicon.github.io/tranXform/ (Источник включен). Второй-это фильтр.

инструмент, который заменяет строки в файлах, находится в VBScript (требуется Windows Script Host [WSH] для запуска в старых версиях Windows)

фильтр, вероятно, не работает с Unicode, если вы не перекомпилируете с последними Delphi (или с FreePascal/Lazarus)


Я сталкивался с этой проблемой несколько раз при кодировании в Visual C++. Если он у вас есть, вы можете использовать утилиту поиска и замены Visual studio. Он позволяет выбрать папку и заменить содержимое любого файла в этой папке любым другим текстом, который вы хотите.

В Visual Studio: Правка -> найти и заменить В открывшемся диалоговом окне выберите папку и нажмите "Найти" и "заменить" поля. Надеюсь, это будет полезно.