Поскольку вы знаете, как sed
действовать только между маркерами, ваша настоящая проблема в том, что вы пока не можете заставить его «изменить некоторые столбцы». Это может быть сложно, потому sed
что не знает о столбцах.
Например: если первый столбец ZDMAD, измените третий столбец на 15.
Возможно, этот конкретный пример может быть решен sed
, но в общем случае манипулирование столбцами awk
лучше, потому что он разбивает записи на поля и работает на этом уровне абстракции.
Это работает в моем Debian:
awk ' BEGIN { marked=0 markA="##A" markZ="##B" } $1==markZ $1=="ZDMAD" && marked==1 {$3=15} $1==markA ' file.txt
Процедура:
- Установите полезные переменные в начале (т.е. только один раз); начать в "не отмеченном" состоянии.
Тогда для каждой записи:
- Если первое поле является маркером конца, перейдите в состояние «без метки».
- Если условие выполнено в «помеченном» состоянии, выполните работу.
- Если первое поле является начальным маркером, перейдите в «помеченное» состояние.
- Распечатать всю запись.
Обратите внимание, что процедура сначала проверяет маркер конца, выполняет задание и проверяет последний маркер. Дело в том, что он не должен манипулировать линиями маркера. В вашем примере case условие ( ZDMAD
) не может соответствовать ни одной линии маркера, поэтому другая последовательность не будет проблемой; но в целом вы должны принять это во внимание.