Usando o GNU sed
Para substituir as linhas que iniciam uma linha que corresponde a 3 e continuar para uma linha que corresponde a 5 com New Code :
$ seq 8 | sed '/3/,/5/{/5/ s/.*/New Code/; t; d}'
1
2
New Code
6
7
8
Para linhas no intervalo /3/,/5/ , testamos se a linha corresponde a 5 (o que significa que esta é a última linha do grupo) e, em caso afirmativo, fazemos a substituição para inserir New Code . Se a substituição foi feita, o comando t informará ao sed para ir até o final dos comandos (nesse caso, New Code é impresso). Caso contrário, o comando d informará ao sed para excluir a linha.
Todas as outras linhas são impressas normalmente.
Para alterar o arquivo, a opção -i pode ser usada:
sed -i.bak '/3/,/5/{/5/ s/.*/New Code/; t; d}' file
Usando o awk
Para fazer o mesmo usando o awk:
$ seq 8 | awk '/3/,/5/{if (!f)print "New Code"; f=1; next}; 1'
1
2
New Code
6
7
8
O comando awk trata as linhas no intervalo /3/,/5/ especialmente. Para linhas nesse intervalo, testamos se f é zero (ou seja, se !f for true) e, em caso afirmativo, imprimimos New Code e definimos f para 1 e, em seguida, ignoramos o restante dos comandos e pule para a linha next .
Para linhas fora do intervalo /3/,/5/ , nenhum salto é feito e o 1 faz com que a linha seja impressa. Mais detalhadamente, 1 é uma condição. Como 1 não é zero, a condição é avaliada como verdadeira. Como nenhuma ação está associada à condição, é executada a ação padrão que é imprimir a linha. Assim, 1 é uma abreviação para impressão na linha.
Para alterar um arquivo, a opção -i inplace pode ser usada com o GNU awk 4.1 ou superior:
awk -i inplace '/3/,/5/{if (!f)print "New Code"; f=1; next} 1' file