在Pandoc makefile中用Bash文件重定向代替字符串解释 介绍

在Pandoc makefile中用Bash文件重定向代替字符串解释 介绍,bash,web,makefile,io-redirection,pandoc,Bash,Web,Makefile,Io Redirection,Pandoc,我开始使用为我的个人网站生成静态XHTML。 我使用Pandoc-B参数(请参见下面的makefile)成功地插入了两个链接,这些链接引用了.md文件的$(名称))。这个Pandoc-B参数实际上是用来包含文件名的,因此除了shell解释之外,我还必须使用echo命令的输出重定向 问题 Pandoc-B参数增长太长,无法在makefile中轻松维护。 我想将XHTML字符串移回一个单独的文件,同时保留Bash字符串的解释。cat命令不会执行此操作,因为它不是Bash的一部分 SHELL := /

我开始使用为我的个人网站生成静态XHTML。 我使用Pandoc
-B
参数(请参见下面的
makefile
)成功地插入了两个链接,这些链接引用了
.md
文件的
$(名称)
)。这个Pandoc
-B
参数实际上是用来包含文件名的,因此除了shell解释之外,我还必须使用
echo
命令的输出重定向

问题 Pandoc
-B
参数增长太长,无法在
makefile
中轻松维护。 我想将XHTML字符串移回一个单独的文件,同时保留Bash字符串的解释。
cat
命令不会执行此操作,因为它不是Bash的一部分

SHELL := /bin/bash
NAME  = $(basename $(wildcard *.md))

all: index.html
html: index.html

index.html: $(NAME).md
pandoc $< -S -o $@ \
-B <(echo "<div id=\"PDF\"><ul><li><a href=\"$(NAME).a4.pdf\">A4 PDF</a></li><li><a href=\"$(NAME).letter.pdf\">Letter PDF</a></li></ul></div><div id=\"source\"><ul><li><a href=\"../$(NAME).bib\">BibTeX references</a></li><li><a href=\"$(NAME).md\">Pandoc MarkDown</a></li><li><a href=\"makefile\">makefile</a></li></ul></div>")
SHELL:=/bin/bash
名称=$(基本名称$(通配符*.md))
全部:index.html
html:index.html
index.html:$(名称).md
潘多克$<-S-o$@\

-B将sed与模板一起使用如何?例如,这是一个文件,单词模板是
{{uuuuu NAME}

<div id="PDF"><ul><li><a href="{__NAME__}.a4.pdf">A4 PDF</a></li><li><a href="{__NAME__}.letter.pdf">Letter PDF</a></li></ul></div><div id="source"><ul><li><a href="../{__NAME__}.bib">BibTeX references</a></li><li><a href="{__NAME__}.md">Pandoc MarkDown</a></li><li><a href="makefile">makefile</a></li></ul></div>
您可以使用sed替换它们:

pandoc $< -S -o $@ \
-B <(sed -e "s|{__NAME__}|$(NAME)|g" file.txt)
pandoc$<-S-o$@\

-B将sed与模板一起使用如何?例如,这是一个文件,单词模板是
{{uuuuu NAME}

<div id="PDF"><ul><li><a href="{__NAME__}.a4.pdf">A4 PDF</a></li><li><a href="{__NAME__}.letter.pdf">Letter PDF</a></li></ul></div><div id="source"><ul><li><a href="../{__NAME__}.bib">BibTeX references</a></li><li><a href="{__NAME__}.md">Pandoc MarkDown</a></li><li><a href="makefile">makefile</a></li></ul></div>
您可以使用sed替换它们:

pandoc $< -S -o $@ \
-B <(sed -e "s|{__NAME__}|$(NAME)|g" file.txt)
pandoc$<-S-o$@\

-B您可以将整个文件读入变量,然后使用
$(subst)
替换所有出现的
$(名称)

SHELL:=/bin/bash
名称:=$(基本名称$(通配符*.md))
模板:=$(shell cat TEMPLATE.html)
全部:index.html
html:index.html
index.html:$(名称).md

pandoc$<-S-o$@-B您可以将整个文件读入变量,然后使用
$(subst)
替换所有出现的
$(名称)

SHELL:=/bin/bash
名称:=$(基本名称$(通配符*.md))
模板:=$(shell cat TEMPLATE.html)
全部:index.html
html:index.html
index.html:$(名称).md

pandoc$<-S-o$@-B我开始欣赏编辑后的答案,因为它比
sed
解决方案更一般。 所提出的解决方案不仅会解释模板文件中的
$(NAME)
变量,还会解释其他各种Bash变量和命令

尽管如此,提出的解决方案不适用于,原因如下:


  • Bash命令
    我开始欣赏编辑后的答案,因为它比
    sed
    解决方案更通用。 所提出的解决方案不仅会解释模板文件中的
    $(NAME)
    变量,还会解释其他各种Bash变量和命令

    尽管如此,提出的解决方案不适用于,原因如下:


  • Bash命令
    pandoc$<-S-o$@-B
    pandoc$<-S-o$@-B要使生成文件更具可读性,可以使用单引号和标准“/”分隔符:
    AFTER:=$(shell sed'S/“/\”/g'AFTER.html)
    。当源字符串和目标字符串不包含许多斜杠时(在常见情况下),斜杠用作分隔符。实际上,您可以使用任何字符(不包含源字符串或目标字符串)作为分隔符,但公共斜杠更具可读性。@loentar好的,我在回答中将
    sed-e“s”s“s”g“g”改为
    sed's/“/\”/g“
    。谢谢。为了使您的Makefile更具可读性,您可以使用单引号和标准“/”分隔符:
    AFTER:=$(shell sed的/“/\ \”/g'AFTER.html)
    。当源字符串和目标字符串不包含许多斜杠时(在常见情况下),斜杠用作分隔符。实际上,您可以使用任何字符(不包含源字符串或目标字符串)作为分隔符,但公共斜杠更具可读性。@loentar好的,我在回答中将
    sed-e“s”s“s”g“g”改为
    sed's/“/\”/g“
    。谢谢
    <div id="PDF"><ul><li><a href="$(NAME).a4.pdf">A4 PDF</a></li><li><a href="$(NAME).letter.pdf">Letter PDF</a></li></ul></div><div id="source"><ul><li><a href="../$(NAME).bib">BibTeX references</a></li><li><a href="$(NAME).md">Pandoc MarkDown</a></li><li><a href="makefile">makefile</a></li></ul></div>
    
    SHELL := /bin/bash
    NAME  := $(basename $(wildcard *.md))
    BEFORE := $(shell sed 's/"/\\"/g' before.html)
    AFTER := $(shell sed 's/"/\\"/g' after.html)
    
    all: index.html
    html: index.html
    
    index.html: $(NAME).md
        pandoc $< -S -o $@ \
        -B <(echo "$(eval RESULT:=$(BEFORE))$(RESULT)") \
        -A <(echo "$(eval RESULT:=$(AFTER))$(RESULT)")
    
    <div id="PDF">
        <img src="../../images/pdf.png" alt="PDF" width="34" />
        <ul>
            <li><a href="$(NAME).a4.pdf">A4 PDF</a></li>
            <li><a href="$(NAME).letter.pdf">Letter PDF</a></li>
        </ul>
    </div>
    <div id="source">
        <ul>
            <li><a href="../$(NAME).bib">BibTeX references</a></li>
            <li><a href="$(NAME).md">Pandoc MarkDown</a></li>
            <li><a href="makefile">makefile</a></li>
        </ul>
    </div>
    </div>