![Как использовать обратную ссылку вместо имени файла в sed?](https://rvso.com/image/36400/%D0%9A%D0%B0%D0%BA%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%83%D1%8E%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D1%83%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%B2%20sed%3F.png)
Я пытаюсь использовать 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) для ее оценки).