substitui um bloco de texto pelo conteúdo de um arquivo

1

Eu gostaria de substituir o conteúdo entre $ Elements $ e $ EndElements $ no arquivo de texto f1, com os dados de outro arquivo, f2.

O conteúdo de f1 é dado simplesmente por

$Elements$
3
1
5
7
$EndElements$

E o conteúdo de f2 é dado como

1 65 71
2 32 87
3 39 98
4 41 63

O que eu gostaria de obter no final é:

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

Para isso eu tentei algum código sed de páginas stackexchange (bem eu copiei o código e não tenho mais a janela aberta então não posso fornecer o link direto, desculpe)

lead='^\$Elements\$$' 
tail='^\$EndElements\$$'
# f2 is the file where the information
# to replace is kept in 
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
    >         }; /$tail/p; d }"  f2

que não funciona, basicamente não fazendo nada.

Eu não sou um guru de linha de comando, mas usei sed em busca e substituição simples. Tentei encontrar a resposta, mas não tive muita sorte até este ponto.

    
por Umut Tabak 07.06.2017 / 08:35

2 respostas

2

com ed(1) :

echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1

Em detalhes:

  • /\$Elements\$/+1,/\$EndElements\$/-1 corresponde às linhas entre $Elements$ e $EndElements$
  • d exclui as linhas mencionadas
  • .-1 é agora a linha acima de $EndElements$
  • r f2 lê o arquivo f2
  • w escreve os resultados.
por 07.06.2017 / 09:40
2
sed -e "
   /$lead/,/$tail/!b
   //!d
   /$lead/r f2
" f1

Resultados

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

Trabalhando

  1. Primeiro, selecionamos o intervalo adequado usando o operador , comma.
  2. Todas as linhas que não se enquadram nesse intervalo são impressas como estão, por meio do comando b , que ramifica o controle até o final do código sed para essa (s) linha (s).
  3. O corpo do intervalo é excluído, //!d , já que pretendemos substituir o corpo do intervalo pelo arquivo personalizado f2.
  4. A linha de ataque, quando encontrada, lê o conteúdo do arquivo personalizado f2 na fila de impressão (o que não é o mesmo que o espaço de padrão, lembre-se.)
  5. Quando o controle atinge o final do código sed, o conteúdo do espaço padrão, mantendo a linha do lead como esvaziada no stdout e AFTER este evento, é o conteúdo da fila esvaziado no stdout.
por 07.06.2017 / 11:23