替换 z/OS UNIX 文件中的十六进制字符
Substitue hex characters in z/OS UNIX File
我需要使用 sed 非交互式流编辑器从 z/OS JCL步骤。
在这个网站上徘徊,我发现了其他帖子,并且尝试了这个 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 命令代替 \;但不幸的是,我得到了相同的结果
我知道这不能回答 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.. |
我需要使用 sed 非交互式流编辑器从 z/OS JCL步骤。
在这个网站上徘徊,我发现了其他帖子,并且尝试了这个 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 命令代替 \;但不幸的是,我得到了相同的结果
我知道这不能回答 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.. |