Как найти и заменить текст в файле, используя среду командной строки Windows?

417

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

Теги:
batch-file
scripting
command-line
text-files

27 ответов

166
Лучший ответ

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

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
  • 2
    Я второй голос за PowerShell. Это дает вам исключительно способную оболочку.
  • 10
    Я вижу, что PowerShell способен архивировать это. Но как я могу выполнить этот запуск из командного файла (пример: myProc.bat)?
Показать ещё 18 комментариев
180

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

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

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

  • 56
    Осторожно, эта команда также может транскодировать файл в кодировку Unicode. Вы можете вручную указать кодировку, добавив -encoding ASCII или UTF8 или что угодно. Также будьте осторожны, если вы нацелены на UTF8, в начале файла может появиться метка порядка байтов, которая не появилась в оригинале.
  • 66
    @Wyck Мне потребовалось некоторое время, чтобы выяснить, куда поместить -encoding ASCII . Для тех, кто нуждается в этом в будущем, это будет Out-File -encoding ASCII myFile.txt
Показать ещё 8 комментариев
140

Просто используется FART ( " 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.

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


Обновление 2017 (7 лет спустя) jagb указывает в комментариях к статье 2011 года " FARTing the Easy Way - найти и заменить текст" из Mikail Tunç

  • 18
    Крутая вещь, это один единственный exe. Нет зависимостей. Нет маленьких отпечатков. Супер легко развернуть.
  • 0
    Спасибо за пердеж рекомендации. Кажется, работает хорошо, хотя я хотел бы, чтобы он поддерживал регулярные выражения.
Показать ещё 7 комментариев
107

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

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

Script Выход:

teh cat in teh hat
the cat in the hat

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

  • 28
    Чем лучше предложение sed? Это, кажется, самый простой ответ из всех и ничего не требует установки.
  • 5
    Можно ли здесь выполнить какое-либо сопоставление с образцом? Подстановочные знаки, регулярные выражения и т. Д.?
Показать ещё 9 комментариев
51

Создать файл 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

Чтобы использовать этот измененный script (который хорошо вызывает replace.vbs), просто введите в командной строке команду, похожую на это:

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

  • 0
    это аккуратно, это позволяет использовать RegEx?
  • 3
    @ user280109 Да, VBScript поддерживает RegExp . Это можно использовать для замены с использованием регулярного выражения: With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With . Вы можете получить текст первых 9 групп захвата, используя $1 , $2 ... $9 .
Показать ещё 2 комментария
49

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

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

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


  • 1
    Потрясающие. Bliss. Greatfruit.
  • 6
    Я должен подвергнуть сомнению полезность сайта с фрагментами кода, условия использования которого запрещают копировать любой код («Вы не можете распространять любую информацию, предоставленную в домене dostips.com, в любой форме без письменного разрешения владельца домена».) ,
Показать ещё 4 комментария
39

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


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

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

Вот тривиальный пример того, как заменить 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 Multi-line позволяет выполнять поиск по нескольким строкам. Параметр X eXtended substitution pattern предоставляет 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 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.
  • Прочтите прямо из /write непосредственно в файл: нет необходимости в каналах, перенаправлении или переместить команду.
  • Включить предоставленный пользователем JScript
  • Функция перевода похожа на unix tr, только она также поддерживает поиск в регулярном выражении и замену JScript
  • Отменить несогласованный текст
  • Строки вывода префикса с номером строки
  • и более...

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

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

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

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

  • 0
    Качественный товар! Мне нравится этот б / к из-за простоты и способа, которым вы можете адаптировать его к любому сценарию, поэтому пишу код JS, а не паршивую партию.
  • 0
    Редактировать - добавлена опция A только для печати строк, которые были изменены. Также улучшена опция X для поддержки \q для представления " , и литералы поиска теперь поддерживают все расширенные escape-последовательности, когда комбинируются опции L и X.
Показать ещё 13 комментариев
28

Использовать 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"

  • 1
    Это мило. Возможность генерировать командную строку из графического интерфейса - хорошая простая функция, которая заставила меня работать быстрее.
  • 0
    Очень полезный инструмент. Пробовал FART раньше, но документация устарела.
Показать ещё 3 комментария
24

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

sed -c s/FOO/BAR/g filename
  • 2
    Используйте cygwin ( cygwin.com ). Это следующая лучшая вещь для фактической установки Linux.
  • 0
    Лучше, если кто-нибудь предоставит решение, которое не зависит от установки Cygwin. Манипулирование строками POSIX не представляет никакой сложности - делать это в Windows немного сложнее.
Показать ещё 2 комментария
16

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

Лично мне нравится решение по адресу:  - 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

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

Спасибо!

  • 0
    пакетный скрипт не делает ничего, кроме простого копирования файла, а также: почему вы благодарите себя?
  • 0
    Первоначальный запрос состоял в том, чтобы заменить «FOO» на «BAR» в текстовом файле, используя пакетный скрипт и желательно встроенные функции. Если что-то я благодарил за пост группы Google, я нашел, что работает фантастически, и мы все еще используем его по сей день. Кроме того, посты и ответы, подобные этим, также могут быть полезны для пользователей, идущих по дороге. Я не вижу вашего комментария о копировании файла. Конечно, он берет содержимое одного файла и выводит результат в другой файл, но на основе данных он обрезает и анализирует необходимую информацию. Я бы рекомендовал сначала попробовать. ;)
Показать ещё 5 комментариев
13

Когда вы работаете с 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'

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

  • 1
    Обратите внимание, что если вы действительно делаете это переименование в репозитории git и хотите заменить только в версионных файлах, вы можете сделать следующее: git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g' который творит чудеса.
11

С 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"
11

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

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

  • 2
    Это хорошее решение. К сожалению, использование type означает, что все строки длиной более 80 символов переносятся. Какая боль.
11

Я использовал 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
  • 0
    Это самое простое решение +1, при преобразовании из sh в bat просто замените sed на perl -pi.backup -e и оцените его :)
10

Здесь решение, которое я нашел, работало на 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
  • 1
    К сожалению, это также пропускает пустые строки. Особенность команды {{for}}.
7

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

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

Два командных файла, которые снабжают search and replace функциями, были написаны членами Qaru 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, а также многие другие функции.

4

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

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

3

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

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

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

  • 0
    Это тот же ответ, что и ответ от 2010 @VonC В этой теме
  • 0
    @jeb Я указал, что FAR - это не FART - две разные программы с почти одинаковыми именами. FAR имеет графический интерфейс и может работать с регулярным выражением, в то время как в комментариях ниже этой теме люди упоминают , что ФАРТ не поддерживает регулярные выражения.
Показать ещё 1 комментарий
3

Команда командной оболочки работает как шарм

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

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

Для простой замены строк в файлах я использую с тех пор свободные Xchang32.exe из Коллекция Clay Utilities for Win32.

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

И ничто другое не требуется для этого небольшого 32-битного консольного приложения, чем файл Xchang32.exe, извлеченный из ZIP файла, в любую директорию, такую ​​как каталог пакетного файла, вызывающий его для замены (s).

Пример:

Xchang32.exe MyBinaryFile.bin "^x03" "^x02^x05"

Эта командная строка заменяет в файле MyBinaryFile.bin каждый байт значением 3 на два байта со значениями 2 и 5.

Общей проблемой с использованием wmic является то, что выход является файлом Unicode, хотя все символы определенно находятся в диапазоне символов ASCII, т.е. имеют значение кодовой точки ниже десятичного числа 128.

Этот небольшой пакетный код с использованием Xchang32 преобразует выходной файл wmic Unicode, содержащий только символы ASCII в текстовый файл ASCII.

@echo off
rem Remove UTF-16 little endian byte order mark.
Xchang32.exe WmicOutput.txt "^xFF^xFE" "" >nul
rem Was UTF-16 LE BOM really present in file, remove all null bytes.
if not errorlevel 1 Xchang32.exe WmicOutput.txt "^x00" "" >nul

Но иногда вывод wmic перенаправляется непосредственно в текстовый файл ASCII, в результате чего CR CR LF (0D 0D 0A) в текстовом файле ASCII вместо 0D 0A (возврат каретки + строка-строка). Эти неправильные окончания строк также можно легко скорректировать с помощью Xchang32:

Xchang32.exe WmicOutput.txt "^x0D^x0D" "^x0D"

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

Xchang32.exe *.csv "^x09" ",,"

Примечание: ^ и , имеют особое значение в синтаксисе Xchang32 и поэтому должны быть экранированы с помощью другого ^ или ,, как это сделано в командной строке выше, или переключателя /s используется для простых строк. Это описано в файле ReadMe32.txt, а также в выводе справки при запуске Xchang32.exe /? в окне командной строки.

2

Это одно дело, что пакетный скриптинг просто не работает.

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

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

1

Использовать 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"
1

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

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

  • 9
    Cygwin это зло. Не устанавливайте это. Лучше использовать UnixUtils, упомянутые ниже.
  • 24
    Что в этом плохого?
0

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

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

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

-6

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

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

  • 1
    Наджиб, ваш ответ не помогает пользователю, потому что вы предполагаете, что они используют программное обеспечение, о котором они не упоминают. Пожалуйста, предложите вариант, который не требует программного обеспечения.
  • 0
    @Aibrean ответ бесполезен, но не по этой причине, это неправильная точка входа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню