Reemplazar un patrón en un file con una cadena larga

Estoy escribiendo un pequeño script de shell para generar una list de directorys. Para que la salida sea fácilmente personalizable, la secuencia de commands simplemente crea una tabla HTML y luego debe replace un token específico en un file de plantilla con esa tabla y escribirlo en stdout .

Ejemplo:
Archivo de plantilla:

 <!doctype html> <html> <head><title>Directory Listing</title></head> <body> {{LISTING}} </body> </html> 

{{LISTING}} debe replacese con el listdo (que se almacena en una variable de shell).

El problema aquí es que un simple sed 's/{{LISTING}}/$listing/' estaría limitado a la longitud máxima del argumento que no funciona con listdos largos.

¿Cómo puedo replace un patrón en un file con una cadena larga utilizando las utilidades POSIX?

EDITAR:
Para agregar más aclaraciones: Mi solución actual es así:

 awk '{ gsub(A, B); print; }' A="{{LISTING}}" B="$listing" < $template 

$listing se expande a medida que se invoca awk, pero esto puede exceder los límites de longitud de los arguments, ya que $listing puede ser realmente largo. Por ejemplo, cuando genero una list de /usr/lib , obtengo un error:

 /bin/awk: Argument list too long 

Estoy pensando si hay una solución para replace un patrón en un file de text con stdin .

Si hay 3 files:

  • viejo: los datos originales
  • replace: el gran lote de text que desea insert
  • newfile: donde se saveán los reemploops

Debería poder hacer lo siguiente con un shell estándar

 #!/bin/sh for line in `cat old`; do if [ $line == "text to match" ]; then cat replace >> newfile else echo $line >> newfile fi done 

¿Qué tal si usamos xargs ya que conoce los límites de tamaño de los arguments?

 cp "$template_file" "$output_file" || exit 1 echo "$listing" \ | xargs -I arg sed -i 's/{{LISTING}}/arg {{LISTING}}/' "$output_file" \ | sed -i 's/ {{LISTING}}//' "$output_file" 

La advertencia aquí es que xargs elimina las nuevas líneas en los nombres de los files.