如何使用/ pflag“ i”开关使用jrepl仅替换文本文件中的第一个匹配项?

时间:2019-07-11 14:10:09

标签: batch-file

我正在尝试仅替换文本文件中的第一个匹配项。

我的代码是:

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。

1 个答案:

答案 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运行JScr​​ipt正则表达式替换这些选项,以搜索整个文件中的换页符。由于使用了选项/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] ...一次或多次
  • + ...非贪婪
  • ? ...和一个表单供稿。

在标记组内部的表达式所匹配的\f1B 45之间的字节在用0C的替换字符串中被反向引用,以保存在二进制文件中。