2013-09-30 133 views
0

我试图将HTML模板替换为一些自定义字符串的占位符。shell脚本,用于替换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 < 

任何想法?

回答

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 
0
echo "$first" | sed -e 's/\[name\]/TEST/g' > index.html 
+0

您应该双引号'$ first',否则分词和扩展名可能会产生意想不到的后果。 –

+0

@GordonDavisson - 是的,你是对的 - 我编辑了我的答案。 –

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 
0

几个其他人已经提出了解决问题的办法;让我解释为什么原文不起作用。实际上有三个问题:

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

  2. 编辑完成后,sed的下一个参数应该是一个文件名来操作,而不是一个字符串来操作。你需要将它保存到一个文件,或者echo它并将其转换为sed。

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