提取文件中两个单词之间的多个字符串

提取文件中两个单词之间的多个字符串

我有一个这样制作的文本文件:

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

我必须创建 N 个文件来隔离<start:"和之间的字符:"alt>

  • 文件_1.txt ----> xxxxxxxxxxxx
  • 文件_2.txt ----> yyyyyyyyyyyyyy
  • file_3.txt ----> zzzzzz
  • ....
  • ....
  • file_N.txt ----> ttttttttttttt

每个组 (xxxxx, yyyyy, ....., tttt) 都是 base64 类字母表中数千个字符的随意序列[a-z A-Z 0-9 +/=]

我正在寻找可以完成这项工作的 C++ 或批处理代码。感谢您的帮助。

答案1

简单使用JREPL.BAT - 一个混合 JScript/批处理实用程序,可对文本执行正则表达式搜索和替换。JREPL.BAT 是纯脚本,可​​在 XP 及更高版本的任何 Windows 机器上本地运行。

解决方案 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 使用 JScript 代码的批处理变量通过 JREPL 完成所有工作:

@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 使用包含 JSCRIPT 代码的外部文件通过 JREPL 完成所有工作:

名为 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
)

相关内容