Как использовать обратную ссылку вместо имени файла в sed?

Как использовать обратную ссылку вместо имени файла в sed?

Я пытаюсь использовать sedдля сканирования файла и поиска шаблона, затем использовать часть совпавшего шаблона в качестве имени файла и вставить содержимое файла в это место. Я могу заставить большую часть этого работать, но я не могу понять, как использовать обратную ссылку вместо имени файла.

Коротко говоря, необходимо предварительно обработать файл Latex и избавиться от всех \inputкоманд верхнего уровня, потому что lilypond-bookэто глупо™.

# 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

Пока все хорошо, но у него жестко закодированное имя файла, и мне нужно использовать результат сопоставления групп выше (часть между разделителями {и }) в качестве имени файла. К сожалению, это не работает:

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

Как можно использовать сопоставленный шаблон в качестве имени файла в подобной ситуации?

решение1

С помощью GNU sedвы можете сделать что-то вроде:

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

(то есть создать cat<'the-file'команду (экранируя кавычки в имени файла, если необходимо) и использовать eфлаг команды s(который является специфичным для GNU) для ее оценки).

Связанный контент