A maneira mais fácil de fazer isso de uma só vez é usar uma ferramenta que pode pesquisar para trás, ed é uma delas. O ideal seria ter o texto salvo em um arquivo (por exemplo, insert.txt ) e inserir o conteúdo do arquivo duas linhas antes da última ocorrência de PATTERN , para que você pudesse executar:
ed -s infile <<\IN
.t.
?PATTERN?-2r insert.txt
$d
,p
q
IN
Ele encontra a última ocorrência de PATTERN , sobe outras 2 lines e r eads em insert.txt . Em seguida, ele imprime o conteúdo do buffer via ,p . Substitua por w se você quiser editar o arquivo no local.
Com outras ferramentas que não podem pesquisar para trás um two-pass é o caminho a percorrer: 1º passo - obter o número da linha e 2º passo - inserir o conteúdo do texto após a linha NR-2 ou antes da linha NR-1 . Para textos salvos em uma variável, eu prefiro awk sobre outras ferramentas que dependem de regex (a última requer o pré-processamento do texto a ser inserido para escapar de qualquer caractere especial: há vários que precisam ser salvos, não apenas a nova linha , dependendo da técnica usada):
export TEXT
awk 'NR==FNR{if ($0 ~ /PATTERN/){c=NR};next}
{if (FNR==(c-1)){print ENVIRON["TEXT"]}};1' infile infile