Conheço os números de linha com antecedência e os mantenho em outro arquivo:
cat linenos
2
15
42
44
... etc
como você vê, as linhas não são adjacentes, então não posso usar um intervalo para sed
. O objetivo é modificar as linhas do arquivo de destino, digamos, prefixando-as com um marcador como MARKER
A maneira direta é chamar sed
várias vezes para modificar cada linha:
for l in $(cat linenos)
do
sed -i "${l}s/^/MARKER/" target_file
done
que aparentemente chamará sed várias vezes.
CUIDADO : *Esta abordagem não é apenas ineficiente, mas também pode fazer com que as coisas dêem errado se a modificação for diferente de inserir um marcador como este. Qualquer comando sed de exclusão ou inserção de linha, como dar, tornará o número de linha inicial em linenos inválido para as próximas execuções do sed no loop.
O que você sugeriria para melhorar/otimizar isso?
Exemplo de arquivo linenos
cat linenos
2
5
Exemplo de arquivo_destino
cat target_file
line one
line two
line three
line four
line five
line six
Resultado esperado de target_file modificado
cat target_file
line one
MARKERline two
line three
line four
MARKERline five
line six
A abordagem possível que eu criei é criar dinamicamente o cenário sed
SEDCMD=$(for l in $(cat linenos); do echo -n "${l}s/^/MARK/;" ; done)
sed -i -e "$SEDCMD" targetfile
A abordagem abaixo do @steeldriver compartilha a ideia, mas é mais elegante e concisa