Encontre e substitua o texto em vários arquivos

3

Espero que alguém dedique seu tempo ajudando-me a criar um arquivo em lote ou semelhante para encontrar e substituir texto em vários arquivos. Eu tentei muitos utilitários de "pesquisa e substituição", mas não encontrei algo que faz o que eu preciso.

Os requisitos são os seguintes: Encontre e substitua o MESMO texto em vários arquivos com texto diferente PARA CADA ARQUIVO.

Exemplo:

File1.txt, file2.txt, file3.txt, todos têm uma string de texto "mude-me por favor"

para file1.txt substitua a sequência de texto "change me please" por "file1 changed", salve como nome de arquivo original (file1.txt) para arquivo2.txt substitua a seqüência de texto “mude-me por favor” para “arquivo2 alterado” salve como nome de arquivo original (arquivo2.txt) para file3.txt, substitua a string de texto “change me please” por “file3 changed”, salve como nome de arquivo original (file3.txt)

    
por Hennes 12.08.2011 / 08:58

7 respostas

2

Usando comandos do PowerShell:

Get-Content c:\file1.txt | ForEach-Object { $_ -replace "change me please", "file1 changed" } | Set-Content c:\changed1.txt

Get-Content c:\file2.txt | ForEach-Object { $_ -replace "change me please", "file2 changed" } | Set-Content c:\changed2.txt

me deixa com os 2 arquivos:

changed1.txt

changed2.txt

Algum tipo de pessoa pode me dizer como eu renomeia esses arquivos e sobrescrevo os originais:

changed1.txt to file1.txt

changed2.txt to file2.txt

    
por 12.08.2011 / 10:39
1

Powergrep pode fazer o que você pede.

    
por 12.08.2011 / 09:36
1

Se os arquivos não forem muito grandes, você poderá usar

$filenames = @("file1.txt", "file2.txt", "file3.txt")

foreach ($file in $filenames) 
{
    $replacementStr = $file + ' changed' 
    (Get-Content $file) | 
        Foreach-object { $_ -replace 'change me please' , $replacementStr   } | 
     Set-Content $file
}

Observe os colchetes ao redor (arquivo Get-Content $), o que significa que o arquivo é lido na memória (daí os requisitos de que os arquivos são pequenos), mas isso significa que você não está mais em uso quando você escreve de volta.

se os arquivos forem grandes demais para a memória, você poderá gravá-los em um arquivo temporário e usar algo como

Cp $tempfilename $file 
rm $tempfilename

para copiar o arquivo temporário sobre o original e excluir o arquivo temporário.

    
por 12.08.2011 / 11:14
1

Encontrei um problema com seu script. Tendo $ replacementStr = $ file + 'changed' adiciona o arquivo sting $ ao arquivo alterado. Deve ser: $ replacementStr = 'changed'

Eu modifiquei isso para meus próprios propósitos, mas agora os nomes dos arquivos são dinâmicos, a string é alterada corretamente e os caminhos não são quebrados.

Não se esqueça de executar este primeiro ... Set-ExecutionPolicy RemoteSigned

O código segue:

$filenames = @(get-childitem -Path "C:\Program Files\Tivoli\TSM\baclient\*.opt" | % { $_.FullName })

        foreach ($file in $filenames) 
        {
            $replacementStr = 'New String' 
            (Get-Content $file) | 
                Foreach-object { $_ -replace 'Old String' , $replacementStr   } | 
             Set-Content $file
             Write-Host Processed $file
        }

JW

    
por 06.11.2015 / 16:17
0
perl -p -i -e 's/change me please/$argv changed/' file1 file2 subdir/*.txt foo/*.xyz

Você pode baixar Perl (para Windows) de Activestate ou Strawberry etc

    
por 12.08.2011 / 11:17
0

Você pode usar o eclipse - basta carregar os arquivos em um projeto, siga as instruções na página seguinte:

link

Basicamente, faça uma pesquisa na pasta que contém os arquivos. Os resultados serão exibidos em uma guia de pesquisa. Clique com o botão direito do mouse no arquivo que contém os arquivos que você deseja alterar e selecione "Substituir".

Isso mudará todos os arquivos desejados. Bônus adicional de ter seus arquivos em um projeto de eclipse, que pode ser útil de muitas maneiras diferentes. (Controle de origem, destaque de sintaxe, teste de unidade, etc, etc.)

    
por 14.02.2013 / 18:22
0

Abra vários arquivos no Notepad ++ e encontre / substitua todos os arquivos abertos.

    
por 29.04.2016 / 19:51