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

How to replace only the first match in a text file with jrepl using /pflag "i" switch?

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

我的代码是:

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。

可以使用 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 中的帮助输出所述带有 /?/?? 的命令提示符 window。必须分别检测和计算行结尾的行,以识别从第 3 行到第 10 行的块,应该在该块上进行替换,并且该块之外没有任何内容。

使用选项 /PFLAG 的解决方案也可以通过使用:

for /R %%I in ("*.out") do call C:\qsi\jrepl.bat "\f" "" /M /P "\f" /PFLAG "" /F "%%I" /O -
由于选项 /M

JREPL.BAT 使用这些选项运行 JScript 正则表达式替换,在整个文件中搜索换页符。由于使用选项 /PFLAG "",它仅替换第一个换页符,这意味着 运行 case-sensitive 替换没有 flag g 替换 non-global。

但是除了指定为第一个参数的正则表达式搜索字符串之外,还需要指定带有正则表达式字符串的选项 /P,以便使用选项 /PFLAG 和空标志字符串 "" 或使用 "i" 进行 non-global case-insensitive 搜索。在这种情况下,/P 之后的附加正则表达式与主要搜索表达式相同,只是 \f 匹配换页符,即整个文件中的第一个换页符。


更新:

真正的任务是在 binary 文件中删除第一个也是唯一出现的字节序列 1B 45 和第一个出现的 0C 总是在之后1B 45 并将所有其他 0C 保存在文件中。二进制文件包含例如从字节偏移 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处的两个字节1B 45(十六进制02F9)和字节0C 在字节偏移量 912(十六进制 0390)而不删除任何其他字节 0C,就像字节偏移量 1011(十六进制03F3).

以下命令行可用于批处理文件中,用于删除包含 ESC+Ebinary 文件bytes 1B 45 and first Form Feed 存储十六进制字节 0C:

for /R %%I in ("*.out") do call C:\qsi\jrepl.bat "\x1BE([\s\S]+?)\f" "" /M /F "%%I" /O -

正则表达式搜索字符串结果搜索

  • \x1BE ...具有十六进制值的字节 1B 后跟字符 E (case-sensitive) 和
  • (...) ...使用标记组
  • [\s\S] ... 用于空格或 non-whitespace 字符,即任何字符(或字节)
  • + ... 一次或多次
  • ? ... non-greedy
  • \f ...和换页。

1B 450C之间的字节与标记组内的表达式匹配是back-referenced替换字符串保存在二进制文件中。