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