1

我正在尝试在多个 JCL 中执行搜索替换,但我需要多行功能,我需要将一行替换为多个。例子:

//STEP1 EXEC PGM=DUMY,PARAM=XPTO

转变成

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

我研究了文件辅助批处理,但它似乎只支持字符串替换而没有多行支持。我觉得 REXX 可能会这样做,但我对此一无所知。

有任何想法吗?

4

3 回答 3

1

这是一个简单的 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) 
于 2011-11-08T22:03:33.363 回答
1

有些商业产品可以理解 JCL 语法并且可以做这种事情。 JOB/SCAN就是其中之一,我相信这个产品领域的其他人也可以做到。

如果您没有这样的产品,这将无济于事,所以我们回到您的 Rexx 评论。是的,您可以使用Rexx执行此操作,但您将解析 JCL。根据您的要求,这可能很重要。Rexx 没有正则表达式匹配,这是解析时通常使用的。这是可以做到的,如果您不打算做任何比您所指出的更复杂的事情,那么对于 Rexx 程序员来说可能并不太难——也许这是一个成为程序员的机会。Rexx 的设计目标之一是让编程更容易。

另一种方法是使用 Perl,将 PDS 成员复制到 Unix 文件系统以便您可以处理它们,然后在完成后将它们复制回来。假设您正在运行一个相对较新的 z/OS 版本,并且您的系统程序员已经安装了 Perl 的 z/OS 端口,这是一个免费的项目。

如果您愿意将受影响的成员复制到 Unix 文件系统,您可以使用awk来执行此操作。我只涉足过 awk,但它的优点是默认情况下就在那里,没有人需要安装默认情况下不存在的任何东西(Perl)。

于 2011-11-05T14:05:58.887 回答
1

以下是我心中的可能性:

  1. 您可以编写一个简单的 COBOL 程序,该程序将搜索所需的字符串并替换为您想要/需要添加的任何内容。
  2. 您还可以编写 REXX EXEC 来执行此操作,这可能不需要解析读取的代码行。我想,简单的 IF 条件就可以了。

但这里有一些你会遇到的挑战,当然是可以避免的。

  1. 如果某些其他参数与您搜索的内容一起存在怎么办?喜欢

    //STEP1 执行 PGM=DUMY,PARAM=XPTO,PARM1='X'

  2. 如果搜索字符串跨越多行怎么办?喜欢

    //STEP1 执行 PGM=DUMY,

    // 参数=XPTO

于 2011-11-07T17:13:27.480 回答