Parece que a sequência das linhas não importa para o seu caso de uso. Dado isso, eu usaria ex
e simplesmente:
- Remover todas as instâncias de
SMEAR
; - Insira a linha que você deseja.
Você pode fazer isso da seguinte forma:
printf '%s\n' 'g/SMEAR/d' '$a' 'SMEAR=-5' . x | ex file.txt
O primeiro comando é g
lobally d
elete todas as linhas que correspondem à regex /SMEAR/
.
O próximo comando é a
ppend após a última linha ( $
) da linha SMEAR=-5
. O .
termina o texto a ser anexado.
O comando x
salva as alterações e sai.
Cada comando é finalizado por uma nova linha usando printf '%s\n'
para enviá-los para ex
.
Veja também esta solução muito parecida que escrevi um tempo atrás na troca de pilha vi / Vim.
Para testar as alterações imprimindo o arquivo alterado na linha de comando sem salvar as alterações, substitua o x
pelos dois comandos %p 'q!'
da seguinte forma:
printf '%s\n' 'g/SMEAR/d' '$a' 'SMEAR=-5' . %p 'q!' | ex file.txt
%
significa "buffer inteiro", que é o que obtém p
rinted.
q!
significa "sair, descartando as alterações".
Para salvar as alterações em um novo arquivo, substitua o %p
por w newfile.txt
da seguinte forma:
printf '%s\n' 'g/SMEAR/d' '$a' 'SMEAR=-5' . 'w newfile.txt' 'q!' | ex file.txt
Este w
cria o buffer modificado em newfile.txt
.
Como alternativa, você pode fazer isso no início, fazer um backup e salvar o conteúdo do arquivo alterado no local original, file.txt
, assim:
printf '%s\n' 'w file.txt.bak' 'g/SMEAR/d' '$a' 'SMEAR=-5' . x | ex file.txt
Editar: Na verdade, você não precisa usar q!
; simplesmente omitir o x
é suficiente para evitar salvar as alterações. Quando ex
recebe um EOF ao tentar ler mais entradas, ele sai e não salva as alterações.