Quais são as outras respostas dizendo a você tentando lhe dizer
é usar o formulário de endereço sed
first~step
:
Addresses
…
The following address types are supported: …
first~step
Match every step’th line starting with line first.
For example, “sed -n 1~2p
”
will print all the odd-numbered lines in the input stream,
and the address “2~5
” will match every fifth line, starting with the second.
first can be zero; in this case,
sed
operates as if it were equal to step.
(This is an extension.)
A solução óbvia seria preceder todos os comandos em replace.sed
com 2~2
(ou 0~2
, se funciona na sua versão de sed
)
para fazer com que os comandos operem em todas as outras linhas, começando com o segundo
(ou seja, todas as linhas pares no fluxo de entrada, conforme solicitado).
Mas você diz que não pode modificar replace.sed
.
Bem, o próximo passo (como identificado, mas não explicado, pelas outras respostas) é
para criar um arquivo temporário temporário com o recurso Processo de Substituição do shell,
onde <(command_list)
age como um arquivo que é a saída
de command_list
.
Se, como sua pergunta sugere, replace.sed
é apenas uma sequência de comandos substitutos simples, então
sed -f <(sed 's/^/2~2/g' replace.sed)
deve funcionar.
Mas isso tem desvantagens:
- Se você tiver vários comandos por linha,
então o acima afetará apenas o primeiro comando em cada linha.
- Se você tiver comandos com endereços numéricos (por exemplo,
42s/Zaphod/Beeblebrox/
),
eles serão convertidos, por exemplo, em 2~242…
, com a consequência óbvia.
- E se você tiver comandos com endereços não numéricos (por exemplo,
/windows/s/command/cmd/
)
o acima falhará completamente.
Se algum desses casos se aplicar, você deve usar o
sed -f <(sed -e 's/.*/2~2{&;}/' replace.sed)
variação para colocar todos os comandos sed
em cada linha em um grupo de comandos.
Mas mesmo isso falhará se replace.sed
tiver comandos de várias linhas.
Com base nas ideias acima, criei
sed -f <(echo '0~2{'; cat replace.sed; echo '}')
que coloca o arquivo inteiro replace.sed
em um grupo de comandos.
Nos meus testes superficiais,
isso parece resolver as preocupações que levantei com as outras soluções.
Eu não ficaria chocado se tivesse um problema com um replace.sed
muito longo,
ou com comandos muito complexos.