none
Substituir caracter RRS feed

  • Pergunta

  • Pessoal Bom dia,

    Tenho um arquivo TXT que possui diversos endereços de IP, mas todos estão misturados, vejam um exemplo:
    123.35.1.267.142.30.1.528.132.30.9.183

    No exemplo acima eu tenho 3 endereços de IP (ficticios) sendo que o unico separador entre eles é o ponto, o correto são:
    123.35.1.267,142.30.1.528,132.30.9.183

    Eu gostaria de saber se é possivel no powershell fazer algo que ele entenda que a cada 4 valores (que usariam o separador ponto) ele adicionará uma virgula.
    Isso é possivel?

    Agradeço


    Jonathan Santos | http://jonathanrsantos.wordpress.com MCP | MCSA | MCSA Messaging | MCSE | MCITP Exchange 2010 | MCITP Lync Server

    sexta-feira, 26 de outubro de 2012 12:26

Respostas

  • Jonathan,

    Acredito que PowerShell deva existir uma maneira mais fácil utilizando Expressões Regulares, mas eu tenho pouca experiência com expressões regulares.

    Veja se este .VBS quebra seu galho:

    Const ForReading = 1
    Const ForAppending = 8
    
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile("ips.txt", ForReading)
    Set objTextSaida = objFSO.CreateTextFile("ipsNovo.txt", ForAppending, TRUE)
    
    strConteudo = objTextFile.ReadAll
    
    
    PosicaoProcura=1
    NumeroPonto=0
    
    While  not FinaldoTexto
    
    	UltimoPontoLocalizado=instr(PosicaoProcura,strConteudo,".")
    	
    
    	if UltimoPontoLocalizado>0 then
    		NumeroPonto=NumeroPonto+1
    		
    		if NumeroPonto mod 4 = 0 then
    			strConteudo=left(strConteudo,UltimoPontoLocalizado-1) & "," & _
    				mid(strConteudo,UltimoPontoLocalizado+1)
    			
    
    		end if
    	else
    
    		FinaldoTexto=True
    	end if
    
    	PosicaoProcura=UltimoPontoLocalizado+1
    
    wend
    
    objTextSaida.WriteLine (strConteudo)

    Ele lê o arquivo ips.txt e cria um novo ipsNovo.txt. Coloque seu arquivo na mesma pasta do .VBS.

    Se vc quiser que fique um IP por linha, você pode ao invés de substituir o ponto por virgula substituir pela quebra de linha (VbCrLf), altere esta linha

    			strConteudo=left(strConteudo,UltimoPontoLocalizado-1) & VbCrLf & _
    				mid(strConteudo,UltimoPontoLocalizado+1)


    Fábio de Paula Junior

    • Marcado como Resposta Jonathan Santos sexta-feira, 26 de outubro de 2012 15:06
    sexta-feira, 26 de outubro de 2012 14:14
    Moderador
  • Jonathan,

    Fiz esse em PowerShell

    $Arquivo="ips.txt"
    $ArquivoNovo = "ips_Novo.txt"
    
    $ArrIP = (get-content($Arquivo)).split(".")
    $Resultado = @()
    
    for ($i = 0; $i -le $ArrIP.getupperbound(0); $i+=4) {
    
        $Resultado+=$ArrIP[$i]+"."+$ArrIP[$i+1]+"."+$ArrIP[$i+2]+"."+$ArrIP[$i+3]
    
    }
    
    [string]::join(",", $Resultado) > $ArquivoNovo

    Se quiser quebrar por linha, altere a ultima linha do código:

    [string]::join("`r`n", $Resultado) > $ArquivoNovo


    Fábio de Paula Junior

    • Marcado como Resposta Jonathan Santos sábado, 27 de outubro de 2012 18:42
    sábado, 27 de outubro de 2012 11:58
    Moderador

Todas as Respostas

  • Jonathan,

    Acredito que PowerShell deva existir uma maneira mais fácil utilizando Expressões Regulares, mas eu tenho pouca experiência com expressões regulares.

    Veja se este .VBS quebra seu galho:

    Const ForReading = 1
    Const ForAppending = 8
    
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile("ips.txt", ForReading)
    Set objTextSaida = objFSO.CreateTextFile("ipsNovo.txt", ForAppending, TRUE)
    
    strConteudo = objTextFile.ReadAll
    
    
    PosicaoProcura=1
    NumeroPonto=0
    
    While  not FinaldoTexto
    
    	UltimoPontoLocalizado=instr(PosicaoProcura,strConteudo,".")
    	
    
    	if UltimoPontoLocalizado>0 then
    		NumeroPonto=NumeroPonto+1
    		
    		if NumeroPonto mod 4 = 0 then
    			strConteudo=left(strConteudo,UltimoPontoLocalizado-1) & "," & _
    				mid(strConteudo,UltimoPontoLocalizado+1)
    			
    
    		end if
    	else
    
    		FinaldoTexto=True
    	end if
    
    	PosicaoProcura=UltimoPontoLocalizado+1
    
    wend
    
    objTextSaida.WriteLine (strConteudo)

    Ele lê o arquivo ips.txt e cria um novo ipsNovo.txt. Coloque seu arquivo na mesma pasta do .VBS.

    Se vc quiser que fique um IP por linha, você pode ao invés de substituir o ponto por virgula substituir pela quebra de linha (VbCrLf), altere esta linha

    			strConteudo=left(strConteudo,UltimoPontoLocalizado-1) & VbCrLf & _
    				mid(strConteudo,UltimoPontoLocalizado+1)


    Fábio de Paula Junior

    • Marcado como Resposta Jonathan Santos sexta-feira, 26 de outubro de 2012 15:06
    sexta-feira, 26 de outubro de 2012 14:14
    Moderador
  • Olá Fabio Muito Obrigado pela informação,

    Na verdade a alteração desse arquivo segue uma sequancia de tarefas que estou executando em um Script PS1 por isso que fiquei na duvida se existe a opção de usar o Powershell, de qualquer forma eu posso salvar esse VBS e executar com o PS1.

    Obrigado pela dica! Vou dar uma pesquisada em Expressões Regulares também!

    Obrigado!


    Jonathan Santos | http://jonathanrsantos.wordpress.com MCP | MCSA | MCSA Messaging | MCSE | MCITP Exchange 2010 | MCITP Lync Server

    sexta-feira, 26 de outubro de 2012 15:05
  • Jonathan,

    Fiz esse em PowerShell

    $Arquivo="ips.txt"
    $ArquivoNovo = "ips_Novo.txt"
    
    $ArrIP = (get-content($Arquivo)).split(".")
    $Resultado = @()
    
    for ($i = 0; $i -le $ArrIP.getupperbound(0); $i+=4) {
    
        $Resultado+=$ArrIP[$i]+"."+$ArrIP[$i+1]+"."+$ArrIP[$i+2]+"."+$ArrIP[$i+3]
    
    }
    
    [string]::join(",", $Resultado) > $ArquivoNovo

    Se quiser quebrar por linha, altere a ultima linha do código:

    [string]::join("`r`n", $Resultado) > $ArquivoNovo


    Fábio de Paula Junior

    • Marcado como Resposta Jonathan Santos sábado, 27 de outubro de 2012 18:42
    sábado, 27 de outubro de 2012 11:58
    Moderador
  • Cara, Perfeito!
    É exatamente o que eu preciso!

    Eu precisava adicionar virgula mesmo pois o meu código será usado para importar as informações de IP em um Receive Connector no Exchange.

    Obrigado  Fábio!


    Jonathan Santos | http://jonathanrsantos.wordpress.com MCP | MCSA | MCSA Messaging | MCSE | MCITP Exchange 2010 | MCITP Lync Server

    sábado, 27 de outubro de 2012 18:40