使用 Rexx 在 PDS 中查找与给定字符串匹配的成员

Using Rexx to find members in a PDS matching a given string

我正在寻求有关我的 REXX 脚本的帮助。哪个应该打开现有会员并搜索特定字符串。

这是我的脚本:

 /* REXX */ 
"ALLOC FILE(input) DA('.....(MEMBER)') SHR REUSE"
"EXECIO * DISKR "input" (STEM input. FINIS"                    
"FREE FILE(input)"                                             
/* Parmlib werden ausgelesen */                                
do i =1 to input.0                                             
   if POS('met,', input.i) > 0 Then                            
      /* Code if string is found */                            
      say Zeile gefunden                                       
   else                                                        
     /*  Code if string is not found */                        
     say Zeile nicht gefunden                                  
end                                                            

正如 cschneid 所说,这看起来像是您只需要使用 SuperC 的东西。 ISPF 选项 3.14 或 3.15 将搜索字符串并显示结果。您也可以从成员列表中发出 SRCHFOR,然后仅在成员列表中过滤找到的成员。此外,ISPF LM 服务可用于通过 PDS 的成员,然后 运行 编辑宏来进行查找。 EXEXIO 可用于将结果写入输出文件。请注意,SuperC 已经使用 3.15

执行此操作

您也可以从 Rexx 调用 ISRSUPC。很久以前在 MVS 更新中发布了一个漂亮的 Rexx exec。它在 PDS 的所有成员中搜索一个字符串,并在 ISPF 面板上显示“命中列表”,以便您可以编辑或查看成员。

我仍然在我的系统上使用它(无论如何它的后代)。我找到了 MVS 更新文章,这里是:

https://manualzz.com/doc/10913425/mvs0207

在 ISPF 下,编辑宏似乎很合适。如果您还没有 运行,可以设置一个 ISPF 堆栈,也可以批量工作。

如果我没看错您的要求,也许这样的方法可行:

/* REXX-ISPF V/E macro */

Address ISREDIT                                    
"MACRO (needle,dest)"                              
                                                   
"CURSOR = 1 0"                                     
lastHit = 0                                        
i = 0                                              
                                                
"SEEK "needle                                      
Do While RC=0                                      
  "(l#) = CURSOR"                                  
  /* Conditional for multiple hits on same line */ 
  If l# > lastHit Then Do   /* do */               
    "(this) = LINE "l#                             
    i=i+1; out.i = this                            
    lastHit = l#                                   
  End                                              
  "SEEK "needle                                    
End                                                
out.0=i                                            
                                                   
Address TSO                                        
"ALLOCATE F(OUT) DA("dest"') OLD"                  
"EXECIO "out.0" DISKW OUT (FINIS STEM out."        
                                                   
Exit 0                                             

您可以在宏中使用更少的行和更多的 ISPF 服务来做到这一点 (X ALL -> F ALL needle -> DEL ALL X -> CREATE dest)。或者通过间歇性使用 ISPF E 剪贴板。这有一些风险,所以不去讨论它。

关于 ISPF E/V 宏的好处是您使用的命令几乎与您通常在 ISPF E/V 中使用的命令相同。查找很快。它需要适合区域中的整个数据集,这有时可能是个问题。