Шестнадцатеричные символы в файле z / OS UNIX - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно преобразовать один символ LF (x'0A ') в файле z / OS UNIX, чтобы связать символы CRLF (x'0D'x'0A'), используя неинтерактивный поток sed editoR, вызываемый из шага JCL z / OS.

Бродя по этому веб-сайту, я нашел другие посты и попробовал этот шаг 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 вместо \; но, к сожалению, я получаю те же результаты

1 Ответ

0 голосов
/ 12 сентября 2018

Я знаю, что это не отвечает на первоначальный вопрос WRT с использованием sed. Я понимаю вашу дилемму. Вы пытаетесь преобразовать текстовый файл ASCII UNIX в текстовый файл Windows на мэйнфрейме, используя инструменты, разработанные для EBCDIC! Написать собственный фильтр на языке 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;
}

Test

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..       |   
...