Выборочная замена символов в указанных c строках - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть пакетный файл, который создает файл для загрузки в 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 поэтому мне нужно что-то, что превращает эти четыре символа в нечто приемлемое (C, C, # и $), но только в строках, начинающихся с ./ 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

1 Ответ

2 голосов
/ 20 апреля 2020

Если вы просто хотите выполнить подстановку (()-_ на CC#$) в строках, соответствующих ./ ADD, этого должно быть достаточно:

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

Этот код применяет команду y к все строки, которые соответствуют ./ ADD, где . экранируется, потому что это метасимвол, / экранируется, потому что это (неизменяемый) разделитель регулярного выражения, а все остальное является литералом; команда y имеет синтаксис y/abc/def/ и заменяет a на d, b на e и c на f (и разделитель можно изменить на что-то другое, например y!abc!edf! в порядке).

[1] Это команда транслитерации; Я не знаю, Y это называется y, но t принимается командой t est.

...