Wie kann ich in sed anstelle eines Dateinamens eine Rückreferenz verwenden?

Wie kann ich in sed anstelle eines Dateinamens eine Rückreferenz verwenden?

Ich versuche, sedeine 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 \inputBefehle der obersten Ebene zu entfernen, weil lilypond-bookdas 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 sedkö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 eFlag des sBefehls (das GNU-spezifisch ist), um diesen Befehl auszuwerten.)

verwandte Informationen