¿Cómo puedo utilizar una referencia inversa en lugar de un nombre de archivo en sed?

¿Cómo puedo utilizar una referencia inversa en lugar de un nombre de archivo en sed?

Estoy intentando utilizarlo sedpara escanear un archivo y encontrar un patrón, luego usar parte del patrón coincidente como nombre de archivo e insertar el contenido del archivo en esa ubicación. Puedo hacer que la mayor parte funcione, pero parece que no puedo entender cómo usar una referencia inversa en lugar del nombre del archivo.

La versión corta es que es necesario preprocesar un archivo latex y deshacerse de todos los \inputcomandos de nivel superior porque lilypond-bookes Stupid™.

# Setup files for example
$ echo "foo\n\\input{file2}\nfoo" > file1
$ echo "bar\nbar" > file2

# Use sed to find and replace latex \input commands
$ sed $'/^\\\\input{\\(.*\\)}$/ {r file2\n d}' file1
foo
bar
bar
foo

Hasta ahora todo bien, pero tiene un nombre de archivo codificado y necesito usar el resultado de la coincidencia de grupo anterior (la parte entre los delimitadores {y }) como nombre de archivo. Por desgracia, esto no funciona:

$ sed $'/^\\\\input{\\(.*\\)}$/ {r \\1\n d}' file1
foo
foo

¿Cómo puedo utilizar el patrón coincidente como nombre de archivo en un escenario como este?

Respuesta1

Con GNU sedpodrías hacer algo como:

sed '/^\\input{\(.*\)}$/{s//\1/;s/'\''/&\\&&/g;s/.*/cat<'"'&'/e}"

(es decir, crear un cat<'the-file'comando (escapando de las comillas en el nombre del archivo si es necesario) y usar el eindicador del scomando (que es específico de GNU) para evaluar ese comando).

información relacionada