Extrai várias strings entre duas palavras em um arquivo

0

Eu tenho um arquivo de texto feito desta forma:

hjkhkhkjhkh<start:"xxxxxxxxxxxx:"alt>asdsadasd<start:"yyyyyyyyyyyyyy:"alt>gfhfg
hujhyfgh<start:"zzzzzzz:"alt>...........<start:"ttttttttttt:"alt>kjlhkjkgugilkl

Eu tenho que criar N arquivos isolando os caracteres entre <start:" e :"alt>

  • file_1.txt ---- > xxxxxxxxxxxx
  • arquivo_2.txt ---- > yyyyyyyyyyyyyy
  • arquivo_3.txt ---- > zzzzzz
  • ....
  • ....
  • file_N.txt ---- > ttttttttttttt

Cada grupo (xxxxx, yyyyy, ....., tttt) é uma sequência casual de milhares de caracteres no alfabeto semelhante a base64 [a-z A-Z 0-9 +/=]

Estou procurando por um código C ++ ou Batch que possa fazer esse trabalho. Obrigado pela sua ajuda.

    
por user3133076 08.12.2014 / 23:58

1 resposta

2

Simples usando o JREPL.BAT - um utilitário JScript / batch híbrido que executa a pesquisa de expressões regulares e substitua no texto . O JREPL.BAT é um script puro que é executado nativamente em qualquer máquina Windows do XP.

Solução 1 fazendo parte do trabalho com JREPL e alguns com lote:

@echo off
setlocal disableDelayedExpansion
set n=0
for /f delims^=^ eol^= %%A in (
  'jrepl "<start:\q(.*?):\qalt>" $1 /x /jmatch /f test.txt'
) do (
  set /a n+=1
  set "ln=%%A"
  setlocal enableDelayedExpansion
  >file_!n!.txt echo(!ln!
  endlocal
)


Solução 2 fazendo todo o trabalho com JREPL usando uma variável em lote para o código JScript:

@echo off
setlocal disableDelayedExpansion

:: Define beg variable to hold JScript code
:: It is actually one line with line continuation to make it easier to read.
set beg=^
var n=0;^
function write(txt){^
  var fso=new ActiveXObject('Scripting.FileSystemObject');^
  var out=fso.OpenTextFile('file_'+(++n)+'.txt',2,true);^
  out.WriteLine(txt);^
  out.close();^
  return false;^
}

call jrepl "<start:\q(.*?):\qalt>" "write($1)" /x /jmatch /jbeg="%beg%" /f test.txt


Solução 3 fazendo todo o trabalho com o JREPL usando um arquivo externo contendo código JSCRIPT:

arquivo chamado write.jrepl

var n=0;
function write(txt){
  var fso=new ActiveXObject('Scripting.FileSystemObject');
  var out=fso.OpenTextFile('file_'+(++n)+'.txt',2,true);
  out.WriteLine(txt);
  out.close();
  return false;
}

linha de comando (não é necessário lote)

jrepl "<start:\q(.*?):\qalt>" "write($1)" /x /jmatch /jlib=write.jrepl /f test.txt

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

Atualização para eliminar novas linhas indesejadas

O que se segue é a Solução 1 modificada para primeiro eliminar os retornos de carro e as novas linhas. Isso pode ser adaptado para as soluções 2 e 3.

@echo off
setlocal disableDelayedExpansion
set n=0
for /f delims^=^ eol^= %%A in (
  'jrepl "[\r\n]" "" /m /f test.log^|jrepl "<start:\q(.*?):\qalt>" $1 /x /jmatch'
) do (
  set /a n+=1
  set "ln=%%A"
  setlocal enableDelayedExpansion
  >file_!n!.txt echo(!ln!
  endlocal
)
    
por 09.12.2014 / 16:35