使用 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 更新文章,这里是:
在 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 中使用的命令相同。查找很快。它需要适合区域中的整个数据集,这有时可能是个问题。
我正在寻求有关我的 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 更新文章,这里是:
在 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 中使用的命令相同。查找很快。它需要适合区域中的整个数据集,这有时可能是个问题。