问题描述
我有一个 VB 文件,十六进制值“0D25”可以出现在 1 到 20 之间的任何位置(不应更改 21 位置的值)。这需要替换为十六进制值‘4040’。
输入:
----+----1----+----2----+----3----+----4----+
0000/12345678 566 @(#)@0000/12345678 566
FFFF6FFFFFFFF02FFF44B475BFFFF6FFFFFFFF02FFF02
0000112345678D5566005DBD50000112345678D5566D5
预期输出:
----+----1----+----2----+----3----+----4----+
0000/12345678 566 @(#)@0000/12345678 566
FFFF6FFFFFFFF44FFF44B475BFFFF6FFFFFFFF02FFF02
000011234567800566005DBD50000112345678D5566D5
我使用的是带有以下控制卡的 SORT。
SORT FIELDS=copY
OUTREC FIELDS=(1,4,5,20,CHANGE=(20,X'0D25',X'4040'),NOMATCH=(5,20),21)
解决方法
CHANGE=
并不像您认为的那样工作。它仅查找指定位置。然后,它替换为替换字符或 NOMATCH=
字符完全按照长度指定为 CHANGE=
的第一个子参数 (20在你的情况下)。
FINDREP=
在每个位置搜索指定字符,并替换为替换字符。您可以使用 STARTPOS=
和 ENDPOS=
关键字分别限制要检查的记录部分。
在您的情况下,以下语句应满足您的要求:
OUTREC FINDREP=(INOUT=(X'0D25',X'4040'),STARTPOS=5,ENDPOS=24)