Многострочная замена - PullRequest
       6

Многострочная замена

1 голос
/ 05 ноября 2011

Я пытаюсь выполнить поиск-замену в нескольких JCL, но мне нужны многострочные возможности, мне нужно заменить строку на несколько. Пример:

//STEP1 EXEC PGM=DUMY,PARAM=XPTO

преобразовать в

//STEP1 EXEC PGM=WORKS,PARAM=THAT
//SOMEDD DSN=DSN.WITH.SOMETHING
//SYSTIN
SOME MORE PARAMETERS

Я изучил пакетную обработку вспомогательных файлов, но, похоже, она поддерживает только замену STRING без поддержки нескольких строк. Я думаю, что REXX может это сделать, но я ничего об этом не знаю.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Вот возможности, которые я имею в виду:

  1. Вы можете написать простую программу на языке COBOL, которая будет искать нужную строку и заменять на то, что вы хотите / нужно добавить.
  2. Вы также можете написать REXX EXEC для выполнения этого, который может не нуждаться в разборе строки кода, которая читается.Я полагаю, простое условие ЕСЛИ подойдет.

Но вот некоторые проблемы, с которыми вам придется столкнуться и, конечно, их можно избежать.

  1. Что если существуют некоторые другие параметрынаряду с тем, что вы ищете?как

    // STEP1 EXEC PGM = DUMY, PARAM = XPTO, PARM1 = 'X'

  2. Что если строка поиска охватывает более одной строки?как

    // STEP1 EXEC PGM = DUMY,

    // PARAM = XPTO

1 голос
/ 09 ноября 2011

Вот простой макрос редактирования TSO / ISPF, который будет реализовывать ваш пример.Конечно, это очень грубо, но служит примером того, как JCL можно редактировать.

    ISREDIT MACRO ()                                                                
        CONTROL NOFLUSH NOPROMPT   LIST   CONLIST   SYMLIST   MSG               
        ISREDIT CHANGE ' PGM=DUMY' ' PGM=WORKS'                                 
        ISREDIT CHANGE 'XPTO'     'THAT'                                        
        ISREDIT (ROW1,COL1) = CURSOR                                            
        ISREDIT LINE_AFTER &ROW1 = "//SOMEDD DD DSN=DSN.WITH.SOMTHING,DISP=SHR" 
        SET &ROW1 = &ROW1 + 1                                                   
        ISREDIT LINE_AFTER &ROW1 = "//SYSTSIN DD *"                             
        SET &ROW1 = &ROW1 + 1                                                   
        ISREDIT LINE_AFTER &ROW1 = "SOME MORE PARAMETERS"                       
        EXIT CODE(0) 
1 голос
/ 05 ноября 2011

Существуют коммерческие продукты, которые понимают синтаксис JCL и могут делать подобные вещи. JOB / SCAN - это одно, я уверен, что другие в этом продуктовом пространстве тоже могут это сделать.

Что не поможет, если у вас нет такого продукта, поэтому мы вернемся к вашему комментарию Rexx. Да, вы можете сделать это с Rexx , но вы собираетесь анализировать JCL. Это может быть нетривиальным в зависимости от ваших требований. У Rexx нет соответствия регулярному выражению, которое обычно используется при разборе. Это может быть сделано, и если вы не хотите делать что-то намного более сложное, чем то, что вы указали, то, вероятно, это не так уж сложно для программиста Rexx - возможно, это возможность стать им. В качестве одной из своих целей Rexx сделал программирование проще.

Альтернативой может быть использование Perl, копирование членов PDS в файловую систему Unix, чтобы вы могли обрабатывать их, а затем копирование обратно, когда вы закончите. Предполагая, что вы используете относительно актуальную версию z / OS, и ваши программисты установили порт z / OS Perl , который является бесплатным.

Если вы хотите скопировать затронутых участников в файловую систему Unix, вы можете сделать это с помощью awk . Я только баловался с awk, но его преимущество заключается в том, чтобы просто быть там по умолчанию, никому не нужно было устанавливать что-либо (Perl), которого еще нет там по умолчанию.

...