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

Posted

技术标签:

【中文标题】使用 Rexx 在 PDS 中查找与给定字符串匹配的成员【英文标题】:Using Rexx to find members in a PDS matching a given string 【发布时间】:2021-10-25 09:04:57 【问题描述】:

我正在寻求有关我的 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                                                            

【问题讨论】:

程序工作需要什么帮助?我看不出有什么明显的问题。试着把输入行写出来,把更多的say ...放进去 @BruceMartin 很明显,我不需要输出中字符串的位置。我需要输出中的整个搜索字符串。我正在尝试的是,了解如何在大成员中搜索特定字符串,然后将这些字符串写入新成员中。目标是制作一个 rexx 脚本,该脚本将检查这些字符串是否在这里并给出这些字符串的输出 @firedotwater 毫无疑问,没有什么是显而易见的!你是在寻求帮助,那么请礼貌地问一个问题。不要让我们猜测您可能想要什么。 请显示您希望匹配的 o 输出看起来像什么。举个例子。 您是否有理由编写代码而不是使用 ISRSUPC (ISPF 3.14)? 【参考方案1】:

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

【讨论】:

【参考方案2】:

在 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                                             

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于使用 Rexx 在 PDS 中查找与给定字符串匹配的成员的主要内容,如果未能解决你的问题,请参考以下文章

REXX:将长字符串写入 pds 成员

从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

在 Rexx 中查找第 n 个出现的字符

我可以使用 Rexx 在 zos 中读取数据集的分配参数吗?

以编程方式更改 PDS 成员的 ISPF 统计信息中的用户 ID

将参数从 ISPF DSLIST 自动传递到 REXX 脚本