有选择地替换特定行上的字符

Selectively replace characters on specific lines

我有一个批处理文件,它创建一个文件以上传到 z/OS,连接目录中的所有 Pascal 文件。该文件如下所示:

./ ADD LIST=ALL,NAME=AFTER_W
text
text
text
./ ADD LIST=ALL,NAME=WHATEVER
text
more text
./ ADD LIST=ALL,NAME=A-FILE
text
and other text
./ ADD LIST=ALL,NAME=(C)OPY
text
blah
blah

问题是我无法在 z/OS PDS 成员名称中使用某些字符(()-_),所以我需要将这四个字符更改为可接受的内容(CC#$),但 在以 ./ ADD 开头的行上。所以对于上面的输入,输出将是:

./ ADD LIST=ALL,NAME=AFTER$W
text
text
text
./ ADD LIST=ALL,NAME=WHATEVER
text
more text
./ ADD LIST=ALL,NAME=A#FILE
text
and other text
./ ADD LIST=ALL,NAME=CCCOPY
text
blah
blah

如果您只想在匹配 ./ ADD 的行上进行这些替换(()-_CC#$),这就足够了:

sed '/\.\/ ADD /y/()-_/CC#$/' yourinput

此代码将 y 命令¹应用于匹配 ./ ADD 的所有行,其中 . 被转义,因为它是一个元字符,/ 被转义,因为它是正则表达式的(不可变的)定界符,其他一切都是文字; y 命令的语法为 y/abc/def/ 并将 a 替换为 d,将 b 替换为 e,将 c 替换为 f(分隔符可以更改为其他内容,例如 y!abc!edf! 就可以)。

[1] 是音译命令;我不知道 Y 它被称为 y,但是 ttest 命令占用。