У меня есть текстовый файл, созданный таким образом:

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

Я должен создать N файлов, изолирующих символы между <start:" и :"alt>

  • file_1.txt ----> xxxxxxxxxxxx
  • file_2.txt ----> yyyyyyyyyyyyyy
  • file_3.txt ----> zzzzzz
  • ....
  • ....
  • file_N.txt ----> ttttttttttttt

Каждая группа (xxxxx, yyyyy, ....., tttt) представляет собой случайную последовательность тысяч символов в алфавите, подобном base64 [a-z A-Z 0-9 +/=]

Я ищу C++ или пакетный код, который может сделать эту работу. Спасибо за вашу помощь.

1 ответ1

2

Простое использование JREPL.BAT - гибридная утилита JScript/batch, которая выполняет поиск и замену регулярных выражений в тексте. JREPL.BAT - это чистый скрипт, который запускается на любом компьютере с Windows начиная с XP.

Решение 1 выполняет часть работы с JREPL, а часть с пакетной обработкой:

@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
)


Решение 2 выполняет всю работу с JREPL, используя пакетную переменную для кода 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


Решение 3 выполняет всю работу с JREPL с использованием внешнего файла, содержащего код JSCRIPT:

файл с именем 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;
}

командная строка (пакет не требуется)

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

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

Обновление для устранения нежелательных новых строк

Следующее является решением 1, измененным, чтобы сначала устранить возврат каретки и переводы строки. Это может быть адаптировано к решениям 2 и 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
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .