1

如何使用 DCL 在文件中搜索文本?是的,我必须使用 DCL。

文件格式很简单:

<NUMBER OF ENTRIES>
<ID>  <DIRECTORY>
<ID>  <DIRECTORY>
.
.
.
<ID>  <DIRECTORY>

它们由几个空白字符分隔。我只需要在文件中搜索给定的 ID 并提取 DIRECTORY。

这是一项非常简单的任务,但我似乎在任何地方都找不到任何像样的 DCL 文档。

4

2 回答 2

1
Edited.... the forum 'eats' strings like <xx> unless marked as code.    

数据线上是否有尖括号?请提供一个真实的例子是它还是:XX XXX-DIRECTORY

我假设第一个。

随附的 VMS 没有从记录中选择字段的标准工具。但是有一堆标准工具可用于 OpenVMS 可以做到这一点。最值得注意的是 (g)AWK 和 PERL 所以这就是我要使用的:

$ gawk /comm="$1 == ""<xx>"" { print $2 }" tmp.tmp
<xxx-DIRECTORY>

或者

$ perl -ne "print $1 if /^\s*<xx>.*?<([^>]*)/" tmp.tmp
xxx-DIRECTORY

可以根据需要增强这些以区分大小写和空格,并根据需要修剪 <>。也许您需要将搜索 ID 作为参数。

无论如何,在纯 DCL 脚本中,它可能看起来像....

$ IF p2.eqs."" then exit 16
$ CLOSE/NOLOG file
$ OPEN/READ file 'p1
$loop:
$ READ/END=done file rec
$ id = F$EDIT( F$ELEM(0,">",F$ELEM(1,"<",rec)), "UPCASE")
$ IF id.NES.p2 THEN  GOTO loop
$ dir = F$ELEM(0,">",F$ELEM(2,"<",rec))
$ WRITE SYS$OUTPUT dir
$ GOTO loop
$done:
$CLOSE/NOLOG file

如果 <> 不存在,则将其用于核心...

$ rec = F$EDIT(rec,"TRIM,COMPRESS")
$ id = F$EDI(F$ELEM(0," ",rec),"UPCASE")
$ IF id.NES.p2 THEN  GOTO loop
$ dir = F$ELEM(1," ",rec)

perl 将是:

$ perl -ne "print $1 if /^\s*<xx>\s+(\S+)/" tmp.tmp

祝海因好运

于 2012-06-28T14:25:50.597 回答
1

或者,如果 ID 字段看起来像固定宽度,那么您可以将文件转换为 RMS INDEXED ,键入 ID 字段。然后你可以通过调用来进行查找READ/KEY='ID'

在 CONVERT 、 READ /KEY 和 SEARCH /KEY 上调用 HELP

于 2012-10-11T23:18:36.883 回答