Como você sabe como fazer sed
agir apenas entre os marcadores, seu problema real é que você ainda não pode "alterar algumas colunas". Isso pode ser complicado porque sed
não sabe sobre colunas.
For example: When the first column is ZDMAD change 3rd column to 15.
Talvez este exemplo em particular possa ser resolvido em sed
, mas em um caso geral de manipulação de colunas awk
é melhor porque divide registros em campos e opera nesse nível de abstração.
Isso funciona no meu Debian:
awk '
BEGIN {
marked=0
markA="##A"
markZ="##B"
}
$1==markZ {marked=0}
$1=="ZDMAD" && marked==1 {$3=15}
$1==markA {marked=1}
{print $0}
' file.txt
O procedimento:
- Defina variáveis úteis no início (ou seja, apenas uma vez); começar em um estado "não marcado".
Depois, para cada registro:
- Se o primeiro campo for o marcador final, vá para um estado "não marcado".
- Se a condição for atendida enquanto estiver em um estado "marcado", faça o trabalho.
- Se o primeiro campo for o marcador inicial, vá para um estado "marcado".
- Imprima o registro inteiro.
Observe que o procedimento verifica primeiro o marcador final, faz o trabalho e verifica o marcador inicial por último. O ponto é que não deve manipular linhas de marcação. Em seu exemplo, a condição ( ZDMAD
) não pode corresponder a nenhuma linha de marcador, portanto, uma sequência diferente não seria um problema; mas, em geral, você deve levar isso em consideração.