1

我正在尝试使用 HTML 模板并用自定义字符串替换一些占位符。

我在github上做一个模板的卷曲:str=$(curl https://raw.github.com/toneworm/template-html5-sass/master/index.html)将以下内容保存到一个变量中:-

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="description" content="[name]">
<meta name="author" content="">
<title>[name]</title>
<link type="text/css" rel="stylesheet" href="css/styles.css" />
<!--[if lt IE 9]>
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<!-- scripts -->
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>

我想[name]用其他东西进行全局替换(本例中为 TEST)......

目前我有sed -i 's/\[name\]/TEST/g' $first > index.html抛出以下错误: -

sed: 1: "<!DOCTYPE": invalid command code <

有任何想法吗?

4

4 回答 4

1

对于多个搜索替换,请查看 此链接

您还可以使用 Perl,它通过不需要反斜杠来简化内容:

#RAND=$$;
in1="$1"
out1="$2";
#cp $3 /tmp/$3.$RAND
in=$in1 out=$out1 perl -pi -e 's/\Q$ENV{"in"}/$ENV{"out"}/g' $3 

这是使用 1 个文件的另一种方法:

url=https://raw.github.com/toneworm/template-html5-sass/master/index.html; curl $url |sed "s:\[name\]:TEST:g" > index1.html
于 2013-09-30T21:27:43.823 回答
0
echo "$first" | sed -e 's/\[name\]/TEST/g' > index.html
于 2013-09-30T21:13:37.557 回答
0

为什么要将curl命令的输出保存到字符串变量?您可以将文件保存为不同的名称,然后将该文件用于sed.

curl https://raw.github.com/toneworm/template-html5-sass/master/index.html test.html
sed "s|\[name\]|TEST|g" test.html > index.html
于 2013-09-30T21:19:02.547 回答
0

其他几个人已经给出了解决问题的替代方案;让我解释一下为什么原来的不起作用。实际上存在三个问题:

  1. sed 的-i标志带有一个参数(在 GNU 版本的 sed 中是可选的,在 OS X 使用的 BSD 版本中是必需的)。因此s/\[name\]/TEST/g被解释为参数-i而不是编辑操作。顺便说一句,-i意味着对现有文件进行就地操作,但是由于您没有对文件进行操作,因此无论如何这都是不需要的。

  2. 在要执行的编辑之后,sed 的下一个参数应该是要操作的文件名,而不是要操作的字符串。您要么需要将其保存到文件中,要么将其保存echo到 sed 中。

  3. 由于$firstis 不在双引号中,因此 shell 在展开后对其执行分词(和其他一些操作)。这意味着“ <!DOCTYPE”、“ html>”、“ <html”等每个都作为单独的参数传递给 sed。由于s/\[name\]/TEST/g被解释为 的参数-i,因此第一个 (" <!DOCTYPE") 被视为编辑命令(无效),其余的则被视为文件名(它永远不会试图打开)。

于 2013-09-30T21:46:46.067 回答