Как заменить только первое совпадение в текстовом файле на jrepl, используя ключ / pflag «i»? - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь заменить только первое совпадение в текстовом файле.

Мой код:

FOR /R %%a IN ("*.out") DO call C:\qsi\jrepl.bat "FF**********" "**********" /f "%%a" /L /m /o -

FF перед звездочками представляет символ перевода формы.
Код предназначен для удаления канала формы только для первого совпадения.

Я пытался играть с /p & /pflag "i", но не смог заставить его работать.

Я использую последнюю версию 8.2 JREPL.BAT .

1 Ответ

0 голосов
/ 12 июля 2019

Можно использовать опцию 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 для сохранения в двоичных файлах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...