Eu tenho que criar regularmente mais de 100 arquivos de texto a partir de modelos.
Atualmente, uso um shell script excessivamente complicado. Eu acho que existe uma maneira mais inteligente de lidar com isso, mas não sei como.
Eu tenho um "banco de dados":
# outputfile template data1 data2 data3
first.txt $template_main $text1 abcd 1234
second.txt $template_main $text2 efgh 5678
third.txt $template_other $text1 ij 90
E um arquivo de configuração:
template_main=main.txt
template_other=other.txt
text1=whatever
text2=blah
Os modelos são arquivos de texto com espaços reservados como %% data2 %% (o formulário do espaço reservado pode ser alterado).
Alguém conhece uma ferramenta para automatizar isso melhor do que com um script de shell complicado?
shell-script
text-processing
Gregory MOUSSAT
fonte
fonte
Respostas:
Provavelmente existem milhares dessas linguagens de modelos e software associado. Um exemplo popular é o ERB , que faz parte do Ruby de baunilha. Depois de instalar o Ruby, você pode iniciar
irb
um editor ou simplesmente colar o exemplo canônico para ter uma ideia:fonte
Você também pode considerar:
a ferramenta GNU chamada,
m4
que é um processador de texto que gera o texto que você deseja que seja inserido como um modelo com as partes a serem alteradas. Certamente seria mais simples que o shell script. (funciona mais ou como um pré-processador C com #define macro IIRC).a ferramenta GNU
xsltproc
que aplica uma transformação e fornece a saída. O modelo está dentroxml
, exslt
é o formato das coisas de transformação a serem feitas, dexml
modo a gerar texto.Pessoalmente, eu tenho uma preferência por
xslt
, mas no seu caso, embora não caiba nos campos do formulário%DATA1%
%DATA2%
. Ele precisa de xml, então você detestaria alterar seus modelos.Assim, você realmente deve dar uma olhada
m4
.Haskell
linguagem de programação é realmente muito boa em transformar fluxos. Estou apenas considerando essa idéia porque os amantes de Haskell falam sobre o maravilhosoParsec
pacote, que permite a análise natural dos fluxos de strings. Muito melhor que o xslt, que já é bom. Eu apenas os repito, porque estou apenas aprendendo Haskell e não tenho a única idéia de como transformar texto com ele por enquanto .fonte
Eu acho que seria melhor procurar uma linguagem de script real, como PHP, Perl ou Python, para fazer algo assim por você, especialmente se você realmente não quiser entrar em scripts de shell complexos em larga escala.
fonte
Não sei por que você faz isso, mas você tem dois modelos aqui. Um é o seu 'banco de dados' e o outro é o seu modelo real. Ambos são fáceis de manusear com shtpl . (projeto particular meu, que não é amplamente utilizado, mas foi desenvolvido para resolver esse tipo de problema)
Com o shtpl, você faria algo assim:
Conteúdo do arquivo 'configuração':
Conteúdo do arquivo 'database' (presumi que o delimitador seja tab (\ t)):
Conteúdo de generatetemplates.sh:
O conteúdo do main.txt (other.txt é o mesmo):
Então, executando generatetemplates.sh
nos gera first.txt, second.txt e third.txt.
Pouca explicação: em generatetemplates.sh é primeiro o 'banco de dados' necessário gerado a partir do seu arquivo de configuração. E, em segundo lugar, para cada tupel no banco de dados, finalmente o arquivo de saída correspondente do seu In-template.
Nota: Um problema de dados [123] vazios é lido. Portanto, não é possível com essa abordagem.
Portanto, espero que isso seja simples o suficiente para suas necessidades.
Diverta-se!
fonte
Publiquei recentemente um projeto de código aberto que realiza exatamente isso usando uma sintaxe de modelo semelhante a um jinja. Chama-se cookie . Aqui está uma demonstração:
fonte
Confira tcat.sh . Digamos que você tenha um arquivo de modelo:
então
Resultado:
fonte