在bash中用字符串替换“模板标签”

3

我有这个:

#!/bin/bash

# Open up the document
read -d '' html <<- EOF
<!DOCTYPE html>
<html>
  <head>
    <title>...</title>
    <meta name="...">
    <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
  <body>
EOF

#Overwrite the old file with a new one
echo "$html" > index.html

# Convert markdown to HTML
`cat README.md | marked --gfm >> index.html`

# Put the converted markdown into the HTML
read -d '' html <<- EOF
  </body>
</html>
EOF

# Save the file
echo "$html" >> index.html

但是我想要的是一次性写入。基本上,在第一个 EOF 中,我也会有 </html></body>,并且在 <body> 标签之间,我想用 {{CONTENT}} 替换为 cat README.md | marked --gfm,像这样:

read -d '' html <<- EOF
    <!DOCTYPE html>
    <html>
      <head>
        <title>...</title>
        <meta name="...">
        <link rel="stylesheet" type="text/css" href="style.css" />
      </head>
      <body>
      {{CONTENT}}
      </body>
    </html>
    EOF

我一遍又一遍地尝试使用sed命令,但我认为我做错了什么,并且我读到了当要搜索的文件内容中有斜杠时会出现问题。我该如何在这里实现sed命令?

3个回答

3
我认为您可以使用单个调用 cat 来完成此操作,使用命令替换将 read-me 插入到中间:
cat << EOF > index.html
<!DOCTYPE html>
<html>
  <head>
    <title>...</title>
    <meta name="...">
    <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
  <body>
  $(marked --gfm < README.md)
  </body>
</html>
EOF

另一个选择可能是使用printf,用简单的格式字符串替换{{CONTENT}}占位符。
read -d '' -r template <<EOF
<!DOCTYPE html>
<html>
<head>
<title>...</title>
<meta name="...">
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
%s
</body>
</html>
EOF

printf "$template" "$(marked --gfm < README.md)"

虽然这样做可以起作用,但它不具有可扩展性,因为将HTML模板移动到脚本之外会导致其无法工作。 - Ignacio Vazquez-Abrams
没错,当我移除了 {{CONTENT}} 占位符的需求时,我就知道我一定漏掉了什么。 - chepner

1

你不会这样做。

md="$(marked --gfm <README.md)"
> index.html
while read html
do
  echo "${html/{{CONTENT}}/$md}" >> index.html
done <<- EOF

    <!DOCTYPE html>
    <html>
      <head>
        <title>...</title>
        <meta name="...">
        <link rel="stylesheet" type="text/css" href="style.css" />
      </head>
      <body>
      {{CONTENT}}
      </body>
    </html>
    EOF

0
这可能适用于您(GNU sed):
sed '/<body>/!b;n;s/.*/&/e' - <<\EOF > index.html
<!DOCTYPE html>
<html>
  <head>
    <title>...</title>
    <meta name="...">
    <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
  <body>
  marked --gfm < README.md
  </body>
</html>
EOF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接