Estou escrevendo um script de arquivo em lotes usando o ambiente de linha de comando do Windows e quero alterar cada ocorrência de algum texto em um arquivo (por exemplo, "FOO") por outro (por exemplo, "BAR"). Qual é a maneira mais simples de fazer isso? Qualquer construído em funções?
492
echo(%text:%search%=%replace%%)
Respostas:
Muitas respostas aqui me ajudaram a apontar na direção certa, mas nenhuma foi adequada para mim, por isso estou postando minha solução.
Eu tenho o Windows 7, que vem com o PowerShell embutido. Aqui está o script que eu usei para encontrar / substituir todas as instâncias de texto em um arquivo:
Para explicar isso:
powershell
inicia o powershell.exe, incluído no Windows 7-Command "... "
é uma linha de comando arg para powershell.exe que contém o comando a ser executado(gc myFile.txt)
lê o conteúdo demyFile.txt
(gc
é abreviação deGet-Content
comando)-replace 'foo', 'bar'
simplesmente executa o comando replace para substituirfoo
porbar
| Out-File myFile.txt
canaliza a saída para o arquivomyFile.txt
-encoding ASCII
impede a transcrição do arquivo de saída para unicode, como os comentários apontamO 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
fonte
-encoding ASCII
ouUTF8
ou o que for necessário. Além disso, tenha cuidado, se você segmentar o UTF8, ele poderá introduzir uma marca de ordem de bytes no início do arquivo que não apareceu no original.-encoding ASCII
. Para quem precisar dele no futuro, seriaOut-File -encoding ASCII myFile.txt
Set-Content
vez deOut-File
.Se você estiver na versão do Windows compatível com .Net 2.0, eu substituirei seu shell. O PowerShell oferece todo o poder do .Net na linha de comando. Existem muitos comandos também. O exemplo abaixo resolverá sua pergunta. Estou usando os nomes completos dos comandos, existem aliases mais curtos, mas isso fornece algo para o Google.
fonte
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Apenas usada FART ( " F ind A nd R moran Jr. T ext" utilitário de linha de comando):
excelente gratuito pouco para substituição de texto dentro de um grande conjunto de arquivos.
Os arquivos de instalação estão no SourceForge .
Exemplo de uso:
irá visualizar as substituições para fazer recursivamente nos arquivos desta distribuição Perl.
Único problema: o ícone do site da FART não é exatamente de bom gosto, refinado ou elegante;)
Atualização 2017 (7 anos depois) jagb aponta nos comentários do artigo de 2011 " FARTing the Easy Way - Find And Replace Text " de Mikail Tunç
fonte
/
e,'
como isso não está funcionando para todos nós , para mim funcionou em alguns casos, mas não funcionou em alguns arquivos e eu não sei porque .. Eu usei isso para substituir o texto com outro texto e uma/
Substituir - Substitua uma subcadeia usando substituição de cadeia Descrição: Para substituir uma subcadeia por outra cadeia, use o recurso de substituição de cadeia. O exemplo mostrado aqui substitui todas as ocorrências "teh" com erros ortográficos por "the" na variável de string str.
Saída do script:
ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
fonte
Crie o arquivo replace.vbs:
Para usar esse script revisado (que chamaremos de replace.vbs), digite um comando semelhante a este no prompt de comando:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
fonte
RegExp
. Você pode usar isso para substituir usando uma expressão regular:With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With
. Você pode obter o texto dos primeiros 9 grupos de captura usando$1
,$2
...$9
.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
eCALL SET
.Linhas contendo caracteres entre
"&<>]|^
podem ser tratadas incorretamente.fonte
Nota - Não deixe de ver a atualização no final desta resposta para obter um link para o JREPL.BAT superior que substitui o REPL.BAT
JREPL.BAT 7.0 e superior, que suporta nativamente unicode (UTF-16LE) por meio da
/UTF
opção, assim como qualquer outro conjunto de caracteres, incluindo UTF-8, via ADO !!!!Eu escrevi um pequeno utilitário JScript / lote híbrido chamado REPL.BAT que é muito conveniente para modificar arquivos ASCII (ou ASCII estendido) por meio da linha de comando ou de um arquivo em lotes. O script puramente nativo não requer a 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 a soluções em lote puras.
O 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 no test.txt, assumindo que REPL.BAT está na sua pasta atual ou, melhor ainda, em algum lugar do seu PATH:
Os recursos de regex JScript o tornam muito poderoso, especialmente a capacidade do texto de substituição de referenciar substrings capturados do texto de pesquisa.
Incluí várias opções no utilitário que o tornam bastante poderoso. Por exemplo, combinar as opções
M
eX
permite a modificação de arquivos binários! AM
opção Multi-line permite pesquisas em várias linhas. AX
opção 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.O utilitário inteiro pode ter sido gravado como JScript puro, mas o arquivo em lote híbrido elimina a necessidade de especificar explicitamente o CSCRIPT toda vez que você deseja usar o utilitário.
Aqui está o script REPL.BAT. A documentação completa está incorporada no script.
ATUALIZAÇÃO IMPORTANTE
Interrompi o desenvolvimento do REPL.BAT e o substituí pelo JREPL.BAT. Este utilitário mais recente tem todas as mesmas funcionalidades do REPL.BAT, além de muito mais:
Como sempre, a documentação completa é incorporada ao script.
A solução trivial original agora é ainda mais simples:
A versão atual do JREPL.BAT está disponível no DosTips . Leia todas as postagens subsequentes no segmento para ver exemplos de uso e um histórico do desenvolvimento.
fonte
\q
a representação"
, e os literais de Pesquisa agora suportam todas as seqüências de escape estendidas quando as opções L e X são combinadas.Use FNR
Use o
fnr
utilitário. Tem algumas vantagens sobrefart
:Faça o download do 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"
fonte
Eu não acho que haja uma maneira de fazer isso com quaisquer comandos internos. Eu sugiro que você baixe algo como Gnuwin32 ou UnxUtils e use o
sed
comando (ou faça o download apenassed
):fonte
sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`
-i - edita o arquivo no local; -b - não processar CR + LF - sem esta opção CR + LF seria convertido para LFEu 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 enviar aproximadamente 500 e-mails diariamente via SMTP a partir 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.
REPLACER:
DEDUPLICATOR (observe o uso de -9 para um número ABA):
Obrigado!
fonte
Quando você trabalha com o Git no Windows , basta iniciar
git-bash
e usarsed
. Ou, ao usar o Windows 10, inicie "Bash no Ubuntu no Windows" (no subsistema Linux) e usesed
.É um editor de fluxo, mas pode editar arquivos diretamente usando o seguinte comando:
-i
A opção é usada para editar no local no nome do arquivo.-e
A opção indica um comando para executar.s
é usado para substituir a expressão encontrada "foo" por "bar" eg
é usado para substituir quaisquer correspondências encontradas.Nota de ereOn:
Se você deseja substituir uma string nos arquivos com versão somente de um repositório Git, convém usar:
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
que faz maravilhas.
fonte
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
que faz maravilhas.Eu brinquei com algumas das respostas existentes aqui e prefiro minha solução aprimorada ...
ou se você quiser salvar a saída novamente em um arquivo ...
A vantagem disso é que você pode canalizar a saída de qualquer programa. Também analisará o uso de expressões regulares com isso. Não foi possível descobrir como transformá-lo em um arquivo BAT para facilitar o uso ... :-(
fonte
type
significa que todas as linhas com mais de 80 caracteres são quebradas. Que dor.Eu usei perl, e isso funciona maravilhosamente.
.orig é a extensão que seria anexada ao arquivo original
Para vários arquivos correspondentes, como * .html
fonte
sed
comperl -pi.backup -e
e apreciá-lo :)Com o replaceer.bat
1) Com a
e?
opção que avaliará seqüências de caracteres especiais, como\n\r
sequências unicode. Nesse caso, substituirá o citado"Foo"
e"Bar"
:2) Substituir diretamente onde
Foo
eBar
não são citados.fonte
Aqui está uma solução que eu achei que funcionou no Win XP. No meu arquivo em lotes em execução, incluí o seguinte:
O
replace.bat
arquivo é como abaixo. Não encontrei uma maneira de incluir essa função no mesmo arquivo em lotes, porque a%%a
variável sempre parece fornecer o último valor no loop for.replace.bat
:fonte
Dê uma olhada em Existe algum utilitário sed como para o cmd.exe que solicitou um equivalente sed no Windows, também deve se aplicar a esta pergunta. Sumário executivo:
fonte
Pode ser um pouco tarde, mas frequentemente procuro coisas semelhantes, pois não quero passar pela dor de obter a aprovação de um software.
No entanto, você geralmente usa a instrução FOR de várias formas. Alguém criou um arquivo em lotes útil que faz uma pesquisa e substitui. Dê uma olhada aqui . É importante entender as limitações do arquivo em lotes fornecido. Por esse motivo, não copio o código fonte nesta resposta.
fonte
Dois arquivos em lotes que fornecem
search and replace
funções foram gravados pelos membros do Stack Overflowdbenham
eaacini
usadosnative built-in jscript
no Windows.Eles são ambos
robust
every swift with large files
em comparação com scripting batch simples, e tambémsimpler
usar para substituir básica de texto. Ambos têmWindows regular expression
correspondência de padrões.Esse
sed-like
arquivo de lote auxiliar é chamadorepl.bat
(por dbenham).Exemplo usando a
L
opção literal:Esse
grep-like
arquivo em lotes auxiliar é chamadofindrepl.bat
(por aacini).Exemplo que possui expressões regulares ativas:
Ambos se tornam poderosos utilitários para todo o sistema
when placed in a folder that is on the path
ou podem ser usados na mesma pasta com um arquivo em lotes ou no prompt do cmd.Ambos têm
case-insensitive
interruptores e também muitas outras funções.fonte
O comando Power Shell funciona como um encanto
fonte
Acabei de enfrentar um problema semelhante - "Pesquise e substitua texto dentro de arquivos", mas com a exceção de que tanto para nomes de arquivos quanto para busca / repalce, 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" (preferível se tiver GUI).
Então, enquanto pesquisava no Google :), encontrei uma ótima ferramenta - FAR (Localizar e substituir) (não FART).
Esse pequeno programa possui uma interface gráfica agradável e suporta regex para pesquisar nomes de arquivos e arquivos. A única desvantagem é que, se você quiser salvar suas configurações, precisará executar o programa como administrador (pelo menos no Win7).
fonte
Estou preferem o uso
sed
de utilitários GNU para Win32 , o seguinte precisa ser notadoPortanto, o código de trabalho
sed
para encontrar e substituir o texto em um arquivo no Windows é o seguinte:fonte
-i
! Se a sua versão sed funcionar, verifique o comando desta resposta: stackoverflow.com/a/33762001/2492801 .Isso é algo que o script em lote simplesmente não faz bem.
O script ao qual os morechilli vinculados funcionarão para alguns arquivos, mas infelizmente serão bloqueados por outros que contenham caracteres como pipes ee comercial.
O VBScript é uma ferramenta interna melhor para esta tarefa. Consulte este artigo para um exemplo: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
fonte
A Rachel deu uma excelente resposta, mas aqui está uma variação para ler o conteúdo de uma
$data
variável do PowerShell . Você pode 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.fonte
Use o powershell em .bat - para Windows 7 ou superior
codificar utf8 é opcional, bom para sites
fonte
Baixar Cygwin (gratuito) e use comandos do tipo unix na linha de comando do Windows.
Sua melhor aposta: sed
fonte
Também pode ver as ferramentas Substituir e ReplaceFilter em https://zoomicon.github.io/tranXform/ (fonte incluída). O segundo é um filtro.
A ferramenta que substitui as strings nos arquivos está no VBScript (é necessário que o Windows Script Host [WSH] seja executado 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 o FreePascal / Lazarus)
fonte
Eu já enfrentei esse problema várias vezes ao codificar no Visual C ++. Se você o possui, 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 nessa pasta por qualquer outro texto que desejar.
No Visual Studio: Editar -> Localizar e substituir Na caixa de diálogo aberta, selecione sua pasta e preencha as caixas "Localizar" e "Substituir por". Espero que isso seja útil.
fonte