Como pesquisar e substituir uma string em vários arquivos de texto (dentro de um diretório) pelo Windows CMD?

5

Eu tenho vários arquivos de texto dentro de um diretório, cada um dos quais eu quero substituir cada ocorrência da string 1 setlinewidth para 10 setlinewidth . Como faço isso via Windows cmd? Por favor ajude.

    
por Carla Hook 11.11.2013 / 13:37

2 respostas

6

Se você pode instalar utilitários de terceiros, o Gnu sed é feito sob medida para esse tipo de operação. O link aponta para uma versão do Windows hospedada no Sourceforge que você pode baixar e instalar. Esta seria a sintaxe no prompt:

for %i in (*.txt) do sed -i "s/1 setlinewidth/10 setlinewidth/g" %i

Nota: com a opção -i , o sed vai sobrescrever os arquivos em questão, por isso certifique-se de ter backups facilmente disponíveis para o caso de algo dar errado.

Se você não conseguir instalar o utilitário sed, isso será muito mais difícil usando apenas a linguagem de lote integrada.

Edit: Eu montei um pequeno arquivo de lote que irá realizar a substituição sem nenhuma ferramenta externa. Salve-o como foo.cmd ou qualquer que seja seu nome preferido e chame-o da linha de comando como: foo.cmd

Uma ressalva: Isso é escrito muito especificamente a partir dos exemplos em sua pergunta. Se houver outro texto ou mesmo espaços extras no início ou no final da linha antes / depois de 1 setlinewidth , esse arquivo em lotes não funcionará. Isso também salvará uma cópia do arquivo de texto original como uma extensão .bak (por exemplo, textfile.txt.bak).

@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

for %%a in (*.txt) do (
    echo Processing %%a...
    for /f "delims=^ tokens=1" %%i in (%%a) do (
        if /i "%%i"=="1 setlinewidth" (
            echo 10 setlinewidth>>%%a.new
        ) else (
            echo %%i>>%%a.new
        )
    )
    move /y %%a %%a.bak > nul
    ren %%a.new %%a
)
    
por 11.11.2013 / 17:41
6

O Powershell tem utilitários que resolverão esse problema sem baixar nenhum software ou utilitário externo. Consulte este artigo pelo Scripting Guy, é muito bom. Além disso, eu diria que dê uma olhada na documentação Set-Content .

Exemplo:

(Get-Content C:\Scripts\Test.txt) | Foreach-Object {$_ -replace "oldString", "newString"} | Set-Content C:\Scripts\Test.txt

    
por 11.11.2013 / 18:31