Ich versuche, sed
eine Datei zu durchsuchen und ein Muster zu finden, dann einen Teil des übereinstimmenden Musters als Dateinamen zu verwenden und den Inhalt der Datei an dieser Stelle einzufügen. Das meiste davon funktioniert, aber ich kann nicht herausfinden, wie ich anstelle des Dateinamens eine Rückreferenz verwenden kann.
Kurz gesagt: Es ist notwendig, eine Latex-Datei vorzuverarbeiten und alle \input
Befehle der obersten Ebene zu entfernen, weil lilypond-book
das dumm™ ist.
# 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
So weit, so gut, aber das hat einen fest codierten Dateinamen und ich muss das Ergebnis der Gruppenübereinstimmung oben (den Teil zwischen den {
und }
Trennzeichen) als Dateinamen verwenden. Leider funktioniert das nicht:
$ sed $'/^\\\\input{\\(.*\\)}$/ {r \\1\n d}' file1
foo
foo
Wie kann ich in einem solchen Szenario das übereinstimmende Muster als Dateinamen verwenden?
Antwort1
Mit GNU sed
könnten Sie beispielsweise Folgendes tun:
sed '/^\\input{\(.*\)}$/{s//\1/;s/'\''/&\\&&/g;s/.*/cat<'"'&'/e}"
(das heißt, erstellen Sie einen cat<'the-file'
Befehl (mit Escape-Zeichen für die Anführungszeichen im Dateinamen, falls erforderlich) und verwenden Sie das e
Flag des s
Befehls (das GNU-spezifisch ist), um diesen Befehl auszuwerten.)