sed: vários intervalos entre padrões, com um passo

1

Eu tenho um script que lê um arquivo de cerca de 3 GB e o envia através de um pipeline envolvendo um número muito pequeno de substituições em uma parte muito pequena do arquivo. Para conseguir isso com o mínimo de sobrecarga, o script especifica um pequeno intervalo conhecido dentro do qual fazer as substituições usando sed '/begin/,/end/' .

Gostaria de adicionar mais algumas substituições em outro intervalo pequeno, conhecido, "delimitado por regex" no mesmo arquivo. Se eu canalizar através do sed novamente, isso introduz sobrecarga desnecessária e não aumentará muito bem.

Existe uma maneira de especificar dois intervalos entre os padrões se eu souber a ordem em que eles aparecerão no arquivo, de modo que o arquivo precise ser lido apenas uma vez?

Algo como 'sed '/begin1/,/end1/ ... /begin2/,/end2/' é o que tenho em mente.

O manual do sed afirma

An address range can be specified by specifying two addresses separated by a comma (,).

Mas não menciona a especificação de conjuntos de dois endereços cada.

    
por WAF 10.12.2015 / 17:32

1 resposta

2

Você não precisa saber qual faixa aparece primeiro no arquivo. Você pode escrever o óbvio:

#/bin/sed -f

/begin1/,/end1/{
# commands specific to range 1
}

/begin2/,/end2/{
# commands specific to range 2
}

e isso vai funcionar.

Sed sempre faz uma única passagem através de suas entradas, lendo cada linha, processando-a através dos comandos que você deu, e depois escrevendo (ou não, conforme apropriado). Você pode provar isso executando sed em um pipeline (a entrada canalizada não é procurada, portanto a operação multi-pass não é possível).

    
por 10.12.2015 / 17:56