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

2

Estou tentando usar sed para varrer um arquivo e encontrar um padrão, depois usar parte do padrão correspondente como um nome de arquivo e inserir o conteúdo do arquivo nesse local. Eu posso fazer com que a maioria funcione, mas não consigo descobrir como usar uma referência de volta no lugar do nome do arquivo.

A versão curta é a necessidade de pré-processar um arquivo de látex e livrar-se de todos os comandos \input 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é aqui tudo bem, mas que 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 o nome do arquivo em um cenário como este?

    
por Caleb 10.05.2014 / 16:17

1 resposta

3

Com o GNU sed você pode fazer algo como:

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

(isto é, crie um comando cat<'the-file' (escapando as aspas no nome do arquivo, se necessário) e use o e do comando s (que é específico do GNU) para avaliar esse comando).

    
por 10.05.2014 / 17:05

Tags