Eu já vi em outro lugar neste site:
sed '/1/{s/1/5/;:a;n;ba}' ztest
Então, uma vez que você encontrou a primeira ocorrência, você faz o loop até o final das linhas de leitura e impressão de arquivos.
Atualizar
Pode ser melhorado apenas substituir a enésima partida. A idéia é armazenar um X
em cada correspondência no espaço de suspensão, e quando todos os X
s estiverem lá, faça um loop até o final do arquivo. Abaixo, o script que substitui a segunda ocorrência:
sed '/1/{G;s/\nX\{1\}//;tend;x;s/^/X/;x;P;d};p;d;:end;s/1/5/;:a;n;ba'
Note que você precisa colocar (N-1) entre o \{
e o \}
.
Atualização 2
Sei que o P;d
acima é inútil se o p;d
for substituído por P;d
. Então, uma solução mais simples é:
sed '/1/{G;s/\nX\{1\}//;tend;x;s/^/X/;x};P;d;:end;s/1/5/;:a;n;ba'