Estou tentando sed
digitalizar um arquivo e encontrar um padrão, depois usar parte do padrão correspondente como nome de arquivo e inserir o conteúdo do arquivo nesse local. Consigo fazer a maior parte funcionar, mas não consigo descobrir como usar uma referência anterior no lugar do nome do arquivo.
A versão resumida é que é necessário pré-processar um arquivo latex e se livrar de todos os \input
comandos de nível superior porque 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\n d}' file1
foo
bar
bar
foo
Até aí tudo bem, mas tem um nome de arquivo codificado e preciso usar o resultado da correspondência de grupo acima (a parte entre os delimitadores {
e }
) como o nome do arquivo. Infelizmente, isso não funciona:
$ sed $'/^\\\\input{\\(.*\\)}$/ {r \\1\n d}' file1
foo
foo
Como posso usar o padrão correspondente como nome de arquivo em um cenário como este?
Responder1
Com o GNU sed
você poderia fazer algo como:
sed '/^\\input{\(.*\)}$/{s//\1/;s/'\''/&\\&&/g;s/.*/cat<'"'&'/e}"
(isto é, crie um cat<'the-file'
comando (escapando das aspas no nome do arquivo, se necessário) e use o e
sinalizador do s
comando (que é específico do GNU) para avaliar esse comando).