首页 > 解决方案 > 在 z/OS UNIX 文件中替换十六进制字符

问题描述

我需要使用从 z/OS JCL 步骤调用的 sed 非交互式流编辑器将 z/OS UNIX 文件中的单个 LF (x'0A') 字符转换为耦合 CRLF (x'0D'x'0A') 字符。

在这个网站上徘徊,我发现了其他帖子,我尝试了这个 JCL 步骤:

//SEDSTEP  EXEC PGM=BPXBATCH,REGION=0M                              
//STDERR   DD SYSOUT=2                                              
//STDOUT   DD SYSOUT=2                                              
//STDPARM  DD *                                                     
SH sed 's/\x0A/\x0Dx0A/g' </u/sftp/zwnmsft/E/wnmcapdf/arxiu_unix.txt
>/u/sftp/zwnmsft/E/wnmcapdf/arxiu_unix_sed.txt                      
/* 

不幸的是,它没有按预期工作。

任何帮助将不胜感激。

提前致谢

阅读您的评论后,我添加了旨在澄清问题的新信息:

1 - 我尝试转换的文件位于 z/OS UNIX 中,但包含无法识别的 ASCII 字符;不是EBCDIC。

2- 此文件不包含任何本机 EBCDIC 换行符 X'15'。

3 - 执行 od -cx 命令后,我尝试转换的文件如下所示:

ZXDALMA@CIGC:/u/sftp/zwnmsft/E/wnmcapdf> od -cx arxiu_unix.txt              
0000000000   060 061 062 063 064 065 066 067 070 071 012 071 070 067 066 065
                3031    3233    3435    3637    3839    0A39    3837    3635
0000000020   064 063 062 061 060 012                                        
                3433    3231    300A                                        
0000000026

4 - 如果我执行这样的 awk 替代方案:

//AWK      EXEC PGM=BPXBATCH,REGION=0M                                  
//STDERR   DD SYSOUT=2                                                  
//STDOUT   DD SYSOUT=2                                                  
//STDPARM  DD *                                                         
SH awk '{ORS=""; gsub("\x0A","\x0D\x0A"); print}'                       
/u/sftp/zwnmsft/E/wnmcapdf/arxiu_unix.txt >                             
/u/sftp/zwnmsft/E/wnmcapdf/arxiu_unix_bis.txt                           
/*    

我得到了想要的结果:

ZXDALMA@CIGC:/u/sftp/zwnmsft/E/wnmcapdf> od -cx arxiu_unix_bis.txt          
0000000000   060 061 062 063 064 065 066 067 070 071  \r 012 071 070 067 066
                3031    3233    3435    3637    3839    0D0A    3938    3736
0000000020   065 064 063 062 061 060  \r 012                                
                3534    3332    3130    0D0A                                
0000000030                                                                 

5 和最后 - 如果我执行 sed 命令,我得到如下:

ZXDALMA@CIGC:/u/sftp/zwnmsft/E/wnmcapdf> od -cx arxiu_unix_sed.txt          
0000000000   060 061 062 063 064 065 066 067 070 071 012 071 070 067 066 065
                3031    3233    3435    3637    3839    0A39    3837    3635
0000000020   064 063 062 061 060 012  \n                                    
                3433    3231    300A    1500                                
0000000027 

我希望这些解释有助于了解我所面临的情况。

Hogstrom 发表的评论中新增的信息:

这是 ls -H 命令的输出:

ZXDALMA@CIGC:/u/sftp/zwnmsft/E/wnmcapdf> ls -H arxiu_unix.txt             
-rwxrwxrwx  bin    1 ZWNMSFT  G@PROJ        22 Sep  5 12:17 arxiu_unix.txt   

关于环境变量,如果我执行 env 命令,这里是输出:

ZXDALMA@CIGC:/u/sftp/zwnmsft/E/wnmcapdf> env                                    
_BPX_TERMPATH=OMVS                                                              
PATH=/bin:/usr/bin:/usr/lib:/usr/lpp/dfsms/bin:/usr/lpp/java/J7.1_64/bin:/u/zxda
lma::/usr/bin:/usr/lib:/usr/lpp/dfsms/bin                                       
SHELL=/bin/sh                                                                   
PS1=$LOGNAME@$SYS:$PWD>                                                         
COLUMNS=80                                                                      
PS2=>>                                                                          
SYS=CIGC                                                                        
_BPX_SPAWN_SCRIPT=YES                                                           
_=/bin/env                                                                      
_BPXK_SETIBMOPT_TRANSPORT=TCPIP                                                 
STEPLIB=none                                                                    
LOGNAME=ZXDALMA                                                                 
TERM=dumb                                                                       
_BPX_SHAREAS=YES                                                                
HOME=/u/zxdalma                                                                 
LINES=20                                                                        
TZ=MET-1DMET-2,M3.5.0/02:00:00,M10.5.0  

一个更重要的细节是我最近意识到在我们的 z/OS UNIX 安装中,ESCape 字符是 [,而不是传统的 .

我在终端的底部看到了这个细节,我看到了这个:

ZXDALMA@CIGC:/u/sftp/zwnmsft/E/wnmcapdf>                                        
 ===>                                                                           
                                                                          INPUT 
ESC=[   1=Help      2=SubCmd    3=HlpRetrn  4=Top       5=Bottom    6=TSO       
        7=BackScr   8=Scroll    9=NextSess 10=Refresh  11=FwdRetr 12=Retrieve  

我也试过我的 sed 命令而不是 \; 但是,不幸的是,我得到了相同的结果

标签: unixsedzos

解决方案


我知道这并不能回答 WRT 使用的原始问题sed。我理解你的困境。您正在尝试使用为 EBCDIC 设计的工具将 ASCII UNIX 文本文件转换为大型机上的 Windows 文本文件!用 C 编写自己的过滤器很简单。

#include <stdio.h>
#include <stdlib.h>

static void put_char(int c) {
    if (putchar(c) == EOF) {
        fputs("Error: putchar() failed with unexpected EOF", stderr);
        exit(EXIT_FAILURE);
    }
}

int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        if (c == '\x0A') put_char('\x0D');
        put_char(c);
    }
    return 0;
}

测试

DOC:/u/doc/src: >printf "hello word\x0ahello again\x0a" | trlf | hexdump
00000000 88859393 9640A696 99840D0A 88859393 |hello word..hell|
00000010 96408187 8189950D 0A                |o again..       |   

推荐阅读