Solução relativamente elegante usando o editor de arquivos especificado POSIX ex
- pelo menos elegante no sentido que isto irá lidar com qualquer conteúdo arbitrário em vez de depender de um formato específico (barras invertidas) ou uma ausência específica de formato.
printf '0r headerfile\nx\n' | ex file-with-contents
Isso abrirá file-with-contents
em ex
, lerá o conteúdo completo de headerfile
no topo e salvará o buffer modificado novamente em file-with-contents
.
Se o desempenho é uma preocupação SEVERA e os arquivos são enormes, isso pode não ser o caminho certo para você, mas (a) não há maneira geral de apresentar dados em um arquivo e (b ) Eu não espero que você esteja editando seu arquivo /etc/services
freqüentemente .
Uma sintaxe ligeiramente mais limpa (a maneira que eu realmente codificaria isso):
printf '%s\n' '0r headerfile' x | ex file-with-contents
Um trecho de código mais complicado, mas convergente, que verificará se o início de services
coincide EXACTLY com a totalidade de header
, byte para byte e IF NOT preenche o conteúdo inteiro de header
to services
e salve as alterações, segue.
Isso é totalmente compatível com POSIX.
dd if=services bs=1 count="$(wc -c < header)" 2>/dev/null |
cmp -s - header ||
printf '%s\n' '0r header' x |
ex services
Uma versão muito mais simples, usando a opção "-n" do GNU cmp
:
cmp -sn "$(wc -c <header)" header services ||
printf '%s\n' '0r header' x | ex services
É claro que nenhum deles é inteligente o suficiente para verificar as correspondências PARCIAIS, mas isso está muito além da capacidade de um simples liner, já que o trabalho de adivinhação estaria intrinsecamente envolvido.