如何使用DCL搜索文件中的文本

时间:2012-06-28 00:14:49

标签: vms dcl

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

文件格式很简单:

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

它们被一些空格字符分隔开来。我只需要在文件中搜索给定的ID并提取DIRECTORY。

这是一项非常简单的任务,但我似乎无法在任何地方找到任何体面的DCL文档。

2 个答案:

答案 0 :(得分: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

根据需要,可以根据情况和空间灵敏度增加那些,并修剪&lt;&gt;如所须。 也许你需要搜索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

如果&lt;&gt;不存在,将其用于核心...

$ 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
祝你好运 海因

答案 1 :(得分:1)

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

在CONVERT,READ / KEY和SEARCH / KEY

上调用HELP