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

StackOverflow https://stackoverflow.com/questions/60034

Вопрос

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

Это было полезно?

Решение

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

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

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

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

  • 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

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

Другие советы

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

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

Просто использовал ПЕРДЕТЬ ("Ф инд А nd р заменить Т ext» утилита командной строки):
отличная небольшая бесплатная программа для замены текста в большом наборе файлов.

Установочные файлы есть на SourceForge.

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

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

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

Единственная проблема:Иконка сайта FART не совсем изящная, изысканная или элегантная ;)


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

Замените - замените подстроение, используя строковую замену Описание:Чтобы заменить подстроку другой строкой, используйте функцию подстановки строк.В приведенном здесь примере все вхождения орфографических ошибок «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

ссылка: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Создайте файл 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.vbs), просто введите в командной строке команду, подобную этой:

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

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

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

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


Примечание - Обязательно посмотрите обновление в конце этого ответа, чтобы найти ссылку на улучшенный JREPL.BAT, который заменяет REPL.BAT.
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:

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

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

Я включил в утилиту ряд опций, которые делают ее весьма мощной.Например, объединение M и X опции позволяют модифицировать двоичные файлы!А M Опция «Многострочный» позволяет осуществлять поиск по нескольким строкам.А 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, $1 represents the first captured
:::            submatch, $2 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
:::                $1 through $10. 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)" "$1" 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($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.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($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.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,"\\$1");
    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($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) {
  var $=arguments;
  return(eval(replace));
}


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

Я прекратил разработку REPL.BAT и заменил его JREPL.BAT.Эта новая утилита имеет все те же функции, что и REPL.BAT, а также многое другое:

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

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

Исходное тривиальное решение теперь стало еще проще:

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

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

Используйте ФНР

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

  • Обычные выражения
  • Дополнительный графический интерфейс.Имеет кнопку «Создать командную строку» для создания текста командной строки для помещения в командный файл.
  • Многострочные узоры:Графический интерфейс позволяет легко работать с многострочными шаблонами.В FART вам придется вручную экранировать разрывы строк.
  • Позволяет выбрать кодировку текстового файла.Также имеется опция автоматического обнаружения.

Загрузите FNR здесь: http://findandreplace.io/?z=codeplex

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

Я не думаю, что есть способ сделать это с помощью каких-либо встроенных команд.Я бы посоветовал вам скачать что-то вроде Гнувин32 или 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/#!topic/alt.msdos.batch.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

ДЕДУПЛИКАТОР (обратите внимание на использование -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 в 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-файл для более удобного использования...:-(

С заменитель.bat

1) С e? опция, которая будет оценивать последовательности специальных символов, такие как \n\r и последовательности Юникода.В этом случае заменит цитируемое "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

А 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

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

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

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

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

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

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

  1. Этотsed-like вспомогательный пакетный файл называется 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 (от Аакини).

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

    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 переключатели, а также многие другие функции.

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

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

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

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

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

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

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

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

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

@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"

Я предпочитаю использовать sed от Утилиты GNU для Win32, необходимо отметить следующее

  • одинарная кавычка '' не будет работать в Windows, используйте "" вместо
  • sed -i не будет работать в Windows, потребуется файл обмен

Итак, рабочий код sed найти и заменить текст в файле в Windows, как показано ниже

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt

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

Ваш лучший выбор:СЭД

Вы также можете увидеть инструменты «Заменить» и «Заменить фильтр» на странице https://zoomicon.github.io/tranXform/ (источник включен).Второй фильтр.

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

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

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

В Visual Studio:РЕДАКТИРОВАТЬ -> Найти и заменить в открытом диалоговом окне, выберите папку и заполните «Найти что -то» и «заменить».Надеюсь, это будет полезно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top