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

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

Краткая версия заключается в том, что необходимо предварительно обработать латексный файл и избавиться от всех команд верхнего уровня \input Becuaase lilypond-book – это 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\nd}' file1 foo bar bar foo 

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

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

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

One Solution collect form web for “Как я могу использовать обратную ссылку вместо имени файла в sed?”

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

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

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

Linux и Unix - лучшая ОС в мире.