Можно использовать опцию 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 запускает регулярное выражение JScript, заменяемое этими параметрами, ища символ перевода формы во всем файле из-за опции /M
.Он заменяет только первую подачу формы из-за использования опции /PFLAG ""
, которая означает запуск замены без учета регистра flag g
для неглобальной замены.
Но это необходимоуказать также параметр /P
со строкой регулярного выражения в дополнение к строке поиска регулярного выражения, указанной в качестве первого аргумента для использования параметра /PFLAG
с пустой строкой флага ""
или с "i"
для неглобального регистра-нечувствительный поиск.В этом случае дополнительное регулярное выражение после /P
совпадает с основным поисковым выражением, просто \f
, чтобы соответствовать каналу формы, первому каналу формы во всем файле.
ОБНОВЛЕНИЕ:
Настоящая задача состоит в том, чтобы сначала удалить из файла двоичного файла последовательность байтов 1B 45
, а первое появление 0C
всегда после 1B 45
с сохранением всего остального 0C
в файле.Двоичный файл содержит, например, начинающийся со смещения байта 752 (шестнадцатеричный 02F0 ) байт:
02F0h: F8 00 FC 01 F8 00 0D 0A 0D <strong>1B 45</strong> 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: <strong>0C</strong> 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 <strong>0C</strong> 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: <strong>0C</strong> 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A ; .***************
Таким образом, задача состоит в том, чтобы удалить два байта 1B 45
со смещением байтов 761 (шестнадцатеричный 02F9 ) и байт 0C
со смещением байтов 912 (шестнадцатеричный 0390 ) без удаления любого другого байта 0C
, например, с байтовым смещением 1011 (шестнадцатеричный 03F3 ).
Следующая командная строка может быть использована в командном файле для удаления в таких двоичных файлах, содержащих ESC + E , сохраненных шестнадцатеричные с байтами 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
соответствующие выражению внутри группы разметки имеют обратную ссылку в строке замены с $1
для сохранения в двоичных файлах.