Como posso usar uma referência anterior no lugar de um nome de arquivo no sed?

Como posso usar uma referência anterior no lugar de um nome de arquivo no sed?

Estou tentando seddigitalizar 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 \inputcomandos 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 sedvocê 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 esinalizador do scomando (que é específico do GNU) para avaliar esse comando).

informação relacionada