我有一个这样制作的文本文件:
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
)