我正在尝试仅替换文本文件中的第一个匹配项。
我的代码是:
FOR /R %%a IN ("*.out") DO call C:\qsi\jrepl.bat "FF**********" "**********" /f "%%a" /L /m /o -
星号前的FF代表换页字符。
该代码仅用于删除第一个匹配项的换页。
我试图和/p
和/pflag "i"
一起玩,但是无法正常工作。
我正在使用JREPL.BAT的最新版本8.2。
答案 0 :(得分:0)
如果第一个换页符位于文本文件顶部的特定块内,并且再也没有换页符,则可以使用 JREPL.BAT 选项/INC
同一块。
第3到10行中的第一个换页示例:
@echo off
for /R %%I in ("*.out") do call C:\qsi\jrepl.bat "\f" "" /INC "3:10" /F "%%I" /O -
JScript正则表达式搜索字符串\f
与换页控制字符匹配。
替换字符串是一个空字符串,用于删除此包含块中的换页。
文字搜索的选项/L
不能用于在搜索字符串中使用\f
或\x0C
(换页控制字符的十六进制值)的情况。
选项/M
不能与使用选项/INC
一起使用,如在命令提示符窗口中使用/?
运行 JREPL.BAT 的帮助输出所解释的那样,或者/??
。必须检测并计数行尾的行,以识别从第3行到第10行的块,应在该块上进行替换,并且在该块之外不进行任何操作。
使用选项/PFLAG
的解决方案也可以通过以下方式实现:
for /R %%I in ("*.out") do call C:\qsi\jrepl.bat "\f" "" /M /P "\f" /PFLAG "" /F "%%I" /O -
JREPL.BAT 使用选项/M
运行JScript正则表达式替换这些选项,以搜索整个文件中的换页符。由于使用了选项/PFLAG ""
,因此它仅替换了第一份表单供稿,这意味着运行不区分大小写的替换而无需使用flag g
来进行非全局替换。
但是,除了将正则表达式搜索字符串指定为使用带有空标记字符串{{1}的选项/P
的第一个参数之外,还必须为正则表达式字符串指定选项/PFLAG
}或使用""
进行非全局不区分大小写的搜索。在这种情况下,"i"
之后的其他正则表达式与主搜索表达式相同,只是/P
与表单供稿匹配,这是整个文件中的第一个表单供稿。
更新:
真正的任务是首先删除 binary 文件,并且仅将字节序列\f
的出现和1B 45
的第一次出现始终在0C
之后并保留所有其他1B 45
的文件。例如,二进制文件包含以字节偏移量 752 (十六进制 02F0 )开头的字节:
02F0h: F8 00 FC 01 F8 00 0D 0A 0D 1B 45 1B 28 73 30 70 ; ø.ü.ø.....E.(s0p 0300h: 30 73 33 62 31 32 68 34 31 30 31 54 1B 26 6C 32 ; 0s3b12h4101T.&l2 0310h: 61 30 6F 30 65 30 6C 38 64 38 38 46 0D 0A 1B 2A ; a0o0e0l8d88F...* 0320h: 70 30 78 30 59 1B 2A 63 35 37 36 30 78 37 39 32 ; p0x0Y.*c5760x792 0330h: 30 59 1B 2A 63 30 54 1B 25 31 42 53 50 31 3B 53 ; 0Y.*c0T.%1BSP1;S 0340h: 43 30 2C 33 2E 33 38 36 37 2C 30 2C 2D 33 2E 33 ; C0,3.3867,0,-3.3 0350h: 38 36 37 2C 32 3B 49 52 30 2C 31 30 30 2C 30 2C ; 867,2;IR0,100,0, 0360h: 31 30 30 3B 53 50 31 3B 44 54 5E 2C 31 3B 53 44 ; 100;SP1;DT^,1;SD 0370h: 32 2C 31 2C 34 2C 31 30 2C 35 2C 30 2C 36 2C 33 ; 2,1,4,10,5,0,6,3 0380h: 2C 37 2C 34 31 34 38 3B 1B 25 31 41 0D 0A 0D 0A ; ,7,4148;.%1A.... 0390h: 0C 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; .*************** 03A0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03B0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03C0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03D0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 0D 0A 0D ; *************... 03E0h: 0A 62 6C 61 68 20 62 6C 61 68 20 62 6C 61 68 0D ; .blah blah blah. 03F0h: 0A 0D 0A 0C 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; ....************
此块应修改为:
02F0h: F8 00 FC 01 F8 00 0D 0A 0D 1B 28 73 30 70 30 73 ; ø.ü.ø.....(s0p0s 0300h: 33 62 31 32 68 34 31 30 31 54 1B 26 6C 32 61 30 ; 3b12h4101T.&l2a0 0310h: 6F 30 65 30 6C 38 64 38 38 46 0D 0A 1B 2A 70 30 ; o0e0l8d88F...*p0 0320h: 78 30 59 1B 2A 63 35 37 36 30 78 37 39 32 30 59 ; x0Y.*c5760x7920Y 0330h: 1B 2A 63 30 54 1B 25 31 42 53 50 31 3B 53 43 30 ; .*c0T.%1BSP1;SC0 0340h: 2C 33 2E 33 38 36 37 2C 30 2C 2D 33 2E 33 38 36 ; ,3.3867,0,-3.386 0350h: 37 2C 32 3B 49 52 30 2C 31 30 30 2C 30 2C 31 30 ; 7,2;IR0,100,0,10 0360h: 30 3B 53 50 31 3B 44 54 5E 2C 31 3B 53 44 32 2C ; 0;SP1;DT^,1;SD2, 0370h: 31 2C 34 2C 31 30 2C 35 2C 30 2C 36 2C 33 2C 37 ; 1,4,10,5,0,6,3,7 0380h: 2C 34 31 34 38 3B 1B 25 31 41 0D 0A 0D 0A 2A 2A ; ,4148;.%1A....** 0390h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03A0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03B0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03C0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; **************** 03D0h: 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 0D 0A 0D 0A 62 6C ; **********....bl 03E0h: 61 68 20 62 6C 61 68 20 62 6C 61 68 0D 0A 0D 0A ; ah blah blah.... 03F0h: 0C 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; .***************
所以任务是删除字节偏移量为 761 (十六进制 02F9 )的两个字节0C
和字节偏移量为1B 45
的字节 912 (十六进制 0390 ),而不会删除其他任何字节0C
,例如字节偏移量 1011 (十六进制 03F3 < / em>)。
以下命令行可用于批处理文件,以从包含 ESC + E 且以字节0C
binary 文件中删除。 >和第一个 Form Feed 存储为十六进制的字节1B 45
:
0C
使用正则表达式搜索字符串进行搜索
for /R %%I in ("*.out") do call C:\qsi\jrepl.bat "\x1BE([\s\S]+?)\f" "$1" /M /F "%%I" /O -
...具有十六进制值\x1BE
的字节,后跟字符1B
(区分大小写)和E
... (
...使用标记组)
...用于空格或非空格字符,即任何字符(或字节)[\s\S]
...一次或多次+
...非贪婪?
...和一个表单供稿。在标记组内部的表达式所匹配的\f
和1B 45
之间的字节在用0C
的替换字符串中被反向引用,以保存在二进制文件中。