如何在DCL中编辑输出中的文本 - OpenVMS脚本

时间:2017-08-21 10:58:51

标签: scripting openvms dcl

我写了下面的代码,它将提取目录名和文件名,我将在提取的文本上使用purge命令。

$ sear VAXMANAGERS_ROOT:[PROC]TEMP.LIS LOG/out=VAXMANAGERS_ROOT:[DEV]FVLIM.TXT
$ OPEN IN VAXMANAGERS_ROOT:[DEV]FVLIM.TXT
$ LOOP:
$ READ/END_OF_FILE=ENDIT IN ABCD
$ GOTO LOOP
$ ENDIT:
$ close in
$ ERROR=F$EXTRACT(0,59,ABCD)
$ sh sym ERROR
$ purge/keep=1 'ERROR'

输出如下:

ERROR = "$1$DKC102:[PROD_LIVE.LOG]DP2017_TMP2.LIS;27392             "

问题在于---每次目录长度变化时(长度可能是59或40或其他值,但目录和文件名长度在我的系统中不会超过59个字符)。所以在上面的输出中,系统也提取该文件号的版本号。因此,我无法将文件与版本号一起清除。

%PURGE-E-PURGEVER, version numbers not permitted

任何建议 - 如何从输出中删除版本号?

我不能使用目录的确切长度,因为目录长度每次变化.... :(

2 个答案:

答案 0 :(得分:1)

虽然HABO解释了它,但还有一些解释

假设我使用f $ search来检查文件是否存在

a = f$search("sys$manager:net$server.log")

然后我发现它存在

wr sys$output a

显示

SYS$SYSROOT:[SYSMGR]NET$SERVER.LOG;9

在f $ parse的帮助下,我得到了

help lex f$parse arg

显示了

`指定包含字段名称的字符串          在文件规范中。指定字段参数会导致          F $ PARSE函数返回文件的特定部分          说明书

     Specify one of the following field names (do not abbreviate):

     NODE       Node name
     DEVICE     Device name
     DIRECTORY  Directory name
     NAME       File name
     TYPE       File type
     VERSION    File version number`

所以我可以做到

wr sys$output f$parse(a,,,"DEVICE")

显示

SYS$SYSROOT:

以及

wr sys$output f$parse(a,,,"DIRECTORY")

所以我得到了

[SYSMGR]

wr sys$output f$parse(a,,,"NAME")

显示

NET$SERVER

wr sys$output f$parse(a,,,"TYPE")

显示

.LOG

版本是

wr sys$output f$parse(a,,,"VERSION")

显示为

;9

lexicals函数可以很方便,使用

进行检查

help lexical

显示

F$CONTEXT F$CSID F$CUNITS F$CVSI F$CVTIME F$CVUI F$DELTA_TIME F$DEVICE F$DIRECTORY F$EDIT F$ELEMENT F$ENVIRONMENT F$EXTRACT F$FAO F$FID_TO_NAME F$FILE_ATTRIBUTES F$GETDVI F$GETENV F$GETJPI F$GETQUI F$GETSYI F$IDENTIFIER F$INTEGER F$LENGTH F$LICENSE F$LOCATE F$MATCH_WILD F$MESSAGE F$MODE F$MULTIPATH F$PARSE F$PID F$PRIVILEGE F$PROCESS F$READLINK F$SEARCH F$SETPRV F$STRING F$SYMLINK_ATTRIBUTES F$TIME F$TRNLNM F$TYPE F$UNIQUE F$USER

答案 1 :(得分:1)

F $ ELEMENT(0,“;”,ABCD)的答案应该有效,如证实。我可能会写这样的东西:

 $ ERROR = F$PARSE(";",ERROR) ! will return $1$DKC102:[PROD_LIVE.LOG]DP2017_TMP2.LIS;
 $ ERROR = ERROR - ";"
 $ PURGE/KEEP=1 'ERROR'

不确定为什么你有读循环。你会得到的是文件中的最后一行,但假设这就是你想要的。