用于替换HTML文件的Shell脚本

时间:2013-09-30 21:00:23

标签: macos bash shell sed terminal

我正在尝试使用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 个答案:

答案 0 :(得分:1)

用于多次搜索替换签出 this link

你也可以使用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

答案 1 :(得分:0)

echo "$first" | sed -e 's/\[name\]/TEST/g' > index.html

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

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

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