sábado, 26 de maio de 2012

Substituição de caracteres de arquivos via DOS


Achei uma bat para fazer replace de caracteres em arquivos muito grandes
O nome da bat é : BatchSubstitute.bat

Estou testando com um arquivo de 50 MB.


Visite : http://www.dostips.com/?t=batch.findandreplace 

Description:This batch allows string substitution in a text file. It parses each line of a text file for a particular string and replaces it with another string.
I.e. To replace all occurrences of "Yellow Submarine" in "color.txt" with "uboot" and put the output on the screen run:
BatchSubstitute.bat "Yellow Submarine" uboot color.txt
Or
type color.txt|BatchSubstitute.bat "Yellow Submarine" uboot

Optionally pipe the output into a new file, i.e.
BatchSubstitute.bat "Yellow Submarine" uboot color.txt>newfile.txt
Or
type color.txt|BatchSubstitute.bat "Yellow Submarine" uboot>newfile.txt
Note: Due to the nature of the FOR command and string substitution, the following known restrictions apply:
  • Lines starting with "]" character will end up empty
  • OldStr must not start with "*"
  • Lines must not contain any of the following characters within a quoted string: "&<>|^"


echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION

::BatchSubstitude - parses a File line by line and replaces a substring"
::syntax: BatchSubstitude.bat OldStr NewStr File
::          OldStr [in] - string to be replaced
::          NewStr [in] - string to replace with
::          File   [in] - file to be parsed
:$changed 20100115
:$source http://www.dostips.com
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B"
    if defined line (
        call set "line=echo.%%line:%~1=%~2%%"
        for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
    ) ELSE echo.
)

7 comentários:

  1. Olá,

    Estou precisando criar uma bat para localizar uma string dentro de um arquivo. Tenho um arquivo chamado config.txt que contém várias informações e preciso localizar a string: "IP_server=" e pegar somente IP.

    Poderia me ajudar??

    Desde já agradeço muito!

    ResponderExcluir
    Respostas
    1. Boa noite!

      Com o DOS o que vai conseguir fazer é

      A bat

      =======================================================

      @echo off
      REM -- Prepare the Command Processor --
      SETLOCAL ENABLEEXTENSIONS
      SETLOCAL DISABLEDELAYEDEXPANSION


      :: String to Find
      :: File to be scanned
      :: The new file name

      find "%1" %2 > %3

      ================================================
      execução na linha de comando do DOS
      [nome da bat] "IP_server" [nome do arquivo para ser scaneado] [arquivo no qual serão gravados resultados]

      Exemplo:
      findstring.bat "IP_server" meuarquivo.txt novoarquivo.txt

      --------------------------------------------------------

      2a. Parte pegar somente o IP
      Para fazer isso você precisaria

      1 - Processar a linha com IP_server (feito anterioramente)
      2 - Identificar a posição do "IP_server=" e guardar esta posição.
      3 - Avançar na string até achar o espaço em branco.
      4 - Guardar a posição do espaço em branco.
      5 - Realizar algo como um substring da linha.

      Veja talvez fazer isso com DOS não seja a melhor ideia.
      Que tal você usar um VBS?

      O DOS é bom para encontrar e substituir caracteres, mas para fazer o que você quer, creio que é impraticável.

      Como curiosidade este é um script de replace de caracteres
      ========================================================
      @echo off
      REM -- Prepare the Command Processor --
      SETLOCAL ENABLEEXTENSIONS
      SETLOCAL DISABLEDELAYEDEXPANSION

      ::BatchSubstitude - parses a File line by line and replaces a substring"
      ::syntax: BatchSubstitude.bat OldStr NewStr File
      :: OldStr [in] - string to be replaced
      :: NewStr [in] - string to replace with
      :: File [in] - file to be parsed
      :$changed 20100115
      :$source http://www.dostips.com
      if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
      for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
      set "line=%%B"
      if defined line (
      call set "line=echo.%%line:%~1=%~2%%"
      for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
      ) ELSE echo.
      )
      ========================================================

      Para fazer o que você quer, que realmente é muito simples, o script seria muito mais complexo. O que significa que o DOS não é a melhor ferramenta para fazer isso.

      Espero ter ajudado.

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Estou começando a mexer em DOS, não entendo para que serve o comando "setlocal enableextensions disabledelayedexpansion" poderia me dar uma ajuda??

    ResponderExcluir
    Respostas
    1. Olá!!!!

      A explicação não explica muito se você não realizar os testes. Mas algo assim.


      enabledelayeexpansion - É para o dos(cmd) reconhecer sintaxe! var! que acessa o valor atual da var. Essa é a primeira parte.

      Segunda parte.

      disabledelayedexpansion - "desliga" o !var! . Ou seja, ele entende o !var!, mas não acessa o conteúdo dela. O var vira um literal.

      Essa técnica é para fazer scripts que geram scripts.

      Se você tem algum experiência com SQLSERVER, acho que esse exemplo vai ajudar um pouco.

      SELECT 'SELECT * FROM ' + name from sysobjects where xtype = 'u'

      Fiz um select que cria vários selects. Isso é um script que cria outro script.

      Se você está achando difícil, não se preocupe, é realmente difícil.

      Espero ter ajudado.

      Dica : se puder, procure outro caminho. Fazer scripts longos em DOS dá performance (às vezes) mas vai consumir bastante tempo de você.

      PS: E tem também a versão de DOS que você está usando. Às vezes o DOS não reconhece de jeito nenhum.

      Excluir
    2. Obrigado pelas dicas, sua explicação me deu uma boa ajuda.

      Excluir
    3. Eu tenho uma aplicação gratuita que disponibilizo neste endereço que faz substituição de conteúdo de arquivos.
      http://refactoringmachine.blogspot.com.br
      Se precisar, baixe-a.
      Se gostar, me doe U$1.
      :D

      Excluir