Como você pode localizar e substituir texto em um arquivo usando o ambiente de linha de comando do Windows?

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

Pergunta

Estou escrevendo um script de arquivo em lote usando o ambiente de linha de comando do Windows e quero alterar cada ocorrência de algum texto em um arquivo (ex."FOO") com outro (ex."BAR").Qual é a maneira mais simples de fazer isso?Alguma função integrada?

Foi útil?

Solução

Muitas das respostas aqui ajudaram-me a apontar a direção certa, porém nenhuma foi adequada para mim, por isso estou postando minha solução.

Eu tenho o Windows 7, que vem com o PowerShell integrado.Aqui está o script que usei para localizar/substituir todas as instâncias de texto em um arquivo:

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

Para explicar:

  • powershell inicia o powershell.exe, que está incluído no Windows 7
  • -Command "... " é um argumento de linha de comando para powershell.exe contendo o comando para executar
  • (gc myFile.txt) lê o conteúdo de myFile.txt (gc é curto para o Get-Content comando)
  • -replace 'foo', 'bar' simplesmente executa o comando replace para substituir foo com bar
  • | Out-File myFile.txt canaliza a saída para o arquivo myFile.txt

Powershell.exe já deve fazer parte da sua instrução PATH, mas se não, você pode adicioná-lo.A localização dele na minha máquina é C:\WINDOWS\system32\WindowsPowerShell\v1.0

Outras dicas

Se você estiver na versão Windows que suporta .Net 2.0, eu substituiria seu shell. PowerShell oferece todo o poder do .Net na linha de comando.Existem muitos commandlets integrados também.O exemplo abaixo resolverá sua dúvida.Estou usando os nomes completos dos comandos, existem aliases mais curtos, mas isso dá a você algo para o Google.

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

Apenas usado PEIDAR ("F ind A e R substituir T ext" utilitário de linha de comando):
excelente pequeno freeware para substituição de texto em um grande conjunto de arquivos.

Os arquivos de configuração estão no SourceForge.

Exemplo de uso:

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

irá visualizar as substituições a serem feitas recursivamente nos arquivos desta distribuição Perl.

Único problema:o ícone do site FART não é exatamente de bom gosto, refinado ou elegante ;)


Atualização 2017 (7 anos depois) jagb aponta nos comentários para o artigo de 2011 "FARTing the Easy Way – Encontre e substitua texto" de Mikail Tunç

Substitua - Substitua uma substring usando a String Substituição Descrição:Para substituir uma substring por outra string, use o recurso de substituição de string.O exemplo mostrado aqui substitui todas as ocorrências de erros ortográficos "teh" por "the" na variável de string str.

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

Saída do script:

teh cat in teh hat
the cat in the hat

referência: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Crie o arquivo 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

Para usar este script revisado (que chamaremos de replace.vbs), basta digitar um comando semelhante a este no prompt de comando:

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

BatchSubstitute.bat em dostips.com é um exemplo de pesquisa e substituição usando um arquivo em lote puro.

Ele usa uma combinação de FOR, FIND e CALL SET.

Linhas contendo caracteres entre "&<>]|^ podem ser tratados incorretamente.


Observação - Certifique-se de ver a atualização no final desta resposta para obter um link para o JREPL.BAT superior que substitui REPL.BAT
JREPL.BAT 7.0 e superior suporta nativamente unicode (UTF-16LE) através do /UTF opção, bem como qualquer outro conjunto de caracteres, incluindo UTF-8, via ADO!!!!


Eu escrevi um pequeno utilitário híbrido JScript/lote chamado REPL.BAT isso é muito conveniente para modificar arquivos ASCII (ou ASCII estendido) por meio da linha de comando ou de um arquivo em lote.O script puramente nativo não requer instalação de nenhum executável de terceiros e funciona em qualquer versão moderna do Windows a partir do XP.Também é muito rápido, especialmente quando comparado com soluções puras em lote.

REPL.BAT simplesmente lê stdin, executa uma pesquisa e substituição de regex JScript e grava o resultado em stdout.

Aqui está um exemplo trivial de como substituir foo por bar em test.txt, assumindo que REPL.BAT está em sua pasta atual, ou melhor ainda, em algum lugar dentro de seu PATH:

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

Os recursos de regex JScript o tornam muito poderoso, especialmente a capacidade do texto de substituição de fazer referência a substrings capturadas do texto de pesquisa.

Incluí uma série de opções no utilitário que o tornam bastante poderoso.Por exemplo, combinando o M e X opções permitem a modificação de arquivos binários!O M A opção multilinha permite pesquisas em várias linhas.O X A opção de padrão de substituição eXtended fornece sequências de escape que permitem a inclusão de qualquer valor binário no texto de substituição.

Todo o utilitário poderia ter sido escrito como JScript puro, mas o arquivo em lote híbrido elimina a necessidade de especificar explicitamente o CSCRIPT sempre que você quiser usar o utilitário.

Aqui está o script REPL.BAT.A documentação completa está incorporada no script.

@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));
}


ATUALIZAÇÃO IMPORTANTE

Interrompi o desenvolvimento do REPL.BAT e o substituí pelo JREPL.BAT.Este utilitário mais recente possui todas as mesmas funcionalidades do REPL.BAT e muito mais:

  • Suporte Unicode UTF-16LE por meio de recursos unicode CSCRIPT nativos e qualquer outro conjunto de caracteres (incluindo UTF-8) via ADO.
  • Ler/gravar diretamente em um arquivo:não há necessidade de pipes, redirecionamento ou comando de movimentação.
  • Incorporar JScript fornecido pelo usuário
  • Recurso de tradução semelhante ao unix tr, mas também suporta pesquisa regex e substituição de JScript
  • Descartar texto não correspondente
  • Prefixar linhas de saída com número de linha
  • e mais...

Como sempre, a documentação completa está incorporada no script.

A solução trivial original agora é ainda mais simples:

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

A versão atual do JREPL.BAT está disponível em DosTips.Leia todas as postagens subsequentes no tópico para ver exemplos de uso e um histórico de desenvolvimento.

Usar FNR

Use o fnr Utilitário.Tem algumas vantagens sobre fart:

  • Expressões regulares
  • GUI opcional.Possui um "botão Gerar linha de comando" para criar texto de linha de comando para colocar em arquivo em lote.
  • Padrões multilinhas:A GUI permite que você trabalhe facilmente com padrões multilinhas.No FART você teria que escapar manualmente das quebras de linha.
  • Permite selecionar a codificação do arquivo de texto.Também possui uma opção de detecção automática.

Baixe o FNR aqui: http://findandreplace.io/?z=codeplex

Exemplo de uso:fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"

Não acho que haja uma maneira de fazer isso com nenhum comando interno.Eu sugiro que você baixe algo como Gnuwin32 ou UnxUtils e use o sed comando (ou baixe apenas sed):

sed -c s/FOO/BAR/g filename

Eu sei que estou atrasado para a festa..

Pessoalmente, gosto da solução em:- http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Também usamos extensivamente a função Dedupe para nos ajudar a entregar aproximadamente 500 e-mails diariamente via SMTP de:- https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

e ambos funcionam nativamente, sem a necessidade de ferramentas ou utilitários extras.

SUBSTITUITOR:

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 (observe o uso de -9 para um número 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

Obrigado!

Quando você trabalha com Git no Windows então simplesmente ligue git-bash E use sed.Ou, ao usar o Windows 10, inicie "Bash on Ubuntu on Windows" (do subsistema Linux) e use sed.

É um editor de stream, mas pode editar arquivos diretamente usando o seguinte comando:

sed -i -e 's/foo/bar/g' filename
  • -i opção é usada para editar no local do nome do arquivo.
  • -e opção indica um comando a ser executado.
    • s é usado para substituir a expressão encontrada "foo" por "bar" e g é usado para substituir quaisquer correspondências encontradas.

Nota de ereOn:

Se você deseja substituir uma string apenas em arquivos versionados de um repositório Git, você pode usar:

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

o que faz maravilhas.

Eu usei perl e isso funciona maravilhosamente bem.

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

.orig é a extensão que seria anexada ao arquivo original

Para vários arquivos correspondentes, como *.html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x

Brinquei com algumas das respostas existentes aqui e prefiro minha solução melhorada...

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

ou se você quiser salvar a saída novamente em um arquivo...

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

A vantagem disso é que você pode canalizar a saída de qualquer programa.Analisaremos o uso de expressões regulares com isso também.Não foi possível descobrir como transformá-lo em um arquivo BAT para facilitar o uso ...:-(

Com o substituto.bat

1) Com e? opção que avaliará sequências de caracteres especiais como \n\r e sequências unicode.Neste caso substituirá o citado "Foo" e "Bar":

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

2) Substituição simples onde o Foo e Bar não são citados.

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

Aqui está uma solução que achei que funcionou no Win XP.No meu arquivo em lote em execução, incluí o seguinte:

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

O replace.bat arquivo é como abaixo.Não encontrei uma maneira de incluir essa função no mesmo arquivo em lote, porque o %%a variável sempre parece fornecer o último valor no loop 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

Dê uma olhada Existe algum utilitário semelhante ao sed para cmd.exe que solicitou um sed equivalente no Windows, também deve se aplicar a esta questão.Sumário executivo:

  • Isso pode ser feito em arquivo em lote, mas não é bonito
  • Muitos executáveis ​​​​de terceiros disponíveis que farão isso por você, se você tiver o luxo de instalar ou apenas copiar um exe
  • Pode ser feito com VBScript ou similar se você precisar de algo capaz de rodar em uma caixa do Windows sem modificação, etc.

Pode ser um pouco tarde, mas frequentemente procuro coisas semelhantes, pois não quero passar pela dor de obter a aprovação do software.

No entanto, você geralmente usa a instrução FOR de várias formas.Alguém criou um arquivo em lote útil que pesquisa e substitui.Dar uma olhada aqui.É importante compreender as limitações do arquivo em lote fornecido.Por esse motivo, não copio o código-fonte nesta resposta.

Dois arquivos em lote que fornecem search and replace funções foram escritas por membros do Stack Overflow dbenham e aacini usando native built-in jscript no Windows.

Eles são ambos robust e very swift with large files em comparação com scripts em lote simples e também simpler para usar para substituição básica de texto.Ambos têm Windows regular expression correspondência de padrões.

  1. Essesed-like arquivo em lote auxiliar é chamado repl.bat (por dbenham).

    Exemplo usando o L troca literal:

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Esse grep-like arquivo em lote auxiliar é chamado findrepl.bat (por aacini).

    Exemplo que possui expressões regulares ativas:

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

Ambos se tornam utilitários poderosos para todo o sistema when placed in a folder that is on the path, ou pode ser usado na mesma pasta com um arquivo em lote ou no prompt do cmd.

Ambos têm case-insensitive interruptores e também muitas outras funções.

O comando Power Shell funciona perfeitamente

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

Acabei de enfrentar um problema semelhante - "Pesquisar e substituir texto em arquivos", mas com a exceção de que para nomes de arquivos e pesquisa/repalce eu preciso usar regex.Como não estou familiarizado com o Powershell e quero salvar minhas pesquisas para uso posterior, preciso de algo mais "amigável" (de preferência se tiver GUI).

Então, enquanto pesquisava no Google :) encontrei uma ótima ferramenta - FAR (Localizar e Substituir) (não FART).

Esse pequeno programa tem uma interface gráfica agradável e suporta regex para pesquisar nomes de arquivos e dentro de arquivos.A única desvantagem é que se você quiser salvar suas configurações você terá que executar o programa como administrador (pelo menos no Win7).

Isso é algo que os scripts em lote simplesmente não funcionam bem.

O roteiro mais pimenta linkado a funcionará para alguns arquivos, mas infelizmente irá engasgar com aqueles que contêm caracteres como barras verticais e e comercial.

VBScript é uma ferramenta integrada melhor para esta tarefa.Veja este artigo para ver um exemplo:http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx

@Rachel deu uma resposta excelente, mas aqui está uma variação dela para ler o conteúdo em um PowerShell $data variável.Você pode então manipular facilmente o conteúdo várias vezes antes de gravar em um arquivo de saída.Veja também como os valores de várias linhas são fornecidos em arquivos em lote .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%"

Use o PowerShell em .bat - para Windows 7+

a codificação utf8 é opcional, boa para sites

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

eu prefiro usar sed de Utilitários GNU para Win32, o seguinte precisa ser observado

  • citação única '' não funciona no Windows, use "" em vez de
  • sed -i não funcionará no Windows, precisará de arquivo trocando

Portanto, o código de trabalho de sed para localizar e substituir texto em um arquivo no Windows é como abaixo

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

Download Cygwin (gratuito) e use comandos do tipo Unix na linha de comando do Windows.

Sua melhor aposta:sed

Também pode ver as ferramentas Substituir e SubstituirFilter em https://zoomicon.github.io/tranXform/ (fonte incluída).O segundo é um filtro.

A ferramenta que substitui strings em arquivos está em VBScript (precisa do Windows Script Host [WSH] para rodar em versões antigas do Windows)

O filtro provavelmente não está funcionando com Unicode, a menos que você recompile com o Delphi mais recente (ou com FreePascal/Lazarus)

Já enfrentei esse problema várias vezes ao codificar em Visual C++.Se tiver, você pode usar o Utilitário Localizar e Substituir do Visual Studio.Ele permite que você selecione uma pasta e substitua o conteúdo de qualquer arquivo dessa pasta por qualquer outro texto desejado.

No Visual Studio:EDIT -> Encontre e substitua na caixa de diálogo aberta, selecione sua pasta e preencha "Encontre o que" e "Substitua por" caixas.Espero que isso seja útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top