Estoy intentando utilizarlo sed
para 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 \input
comandos de nivel superior porque lilypond-book
es 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 sed
podrí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 e
indicador del s
comando (que es específico de GNU) para evaluar ese comando).