Substitui todas as linhas entre dois padrões (inclusive) por um conteúdo de arquivo

3

Tudo está dito no título, quero substituir todas as linhas entre dois padrões por um conteúdo de arquivo.

file1

line 1
line 2
foo
foobar
bar
line 6
line 7

file2

line 3
line 4
line 5

arquivo desejado

line 1
line 2
line 3
line 4
line 5
line 6
line 7

Tentei muitos comandos sed nada funciona para mim, comando mais próximo abaixo com sucesso combina linhas entre foo e bar, mas substituí-los por "$ (cat file2)" string e não conteúdo do arquivo.

sed '/foo/{:a;N;/bar/!ba;N;s/.*\n/$(cat file2)/};p' file1
    
por storm 29.01.2018 / 17:51

1 resposta

2

Você está próximo, eu acho - o seu principal problema é que $(cat file2) será tratado como literal entre aspas simples - você deve estar usando o comando r embutido:

  

r filename

     

Fila o conteúdo do nome do arquivo a ser lido e inserido na saída   fluxo no final do ciclo atual, ou quando a próxima linha de entrada é   ler. Note que se filename não puder ser lido, ele será tratado como se   eram um arquivo vazio, sem qualquer indicação de erro.

Então:

sed '
  /foo/{
    :a
    N
    /\nbar$/!ba
    r file2
    d
  }
' file1

Se você quiser discutir isso em uma linha única, há um truque que você precisará evitar que o sed trate tudo depois do r como parte do nome do arquivo:

sed -e '/foo/{:a; N; /\nbar$/!ba; r file2' -e 'd;}' file1
    
por steeldriver 29.01.2018 / 18:13